国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

spring提供的關(guān)于bean生命周期的接口

Cciradih / 2151人閱讀

摘要:在中注入注入運行結(jié)果注入使用注解正如其名在構(gòu)造器之后,即在銷毀之前。調(diào)用的方法構(gòu)造器注入屬性注入顧名思義,在這個方法里面可以拿到所有裝載的并在初始化之前對某些進(jìn)行修改。

先看一張圖:spring4.x 企業(yè)實戰(zhàn)

spring版本:4.3.17
1、bean自身的生命周期接口

1.1、實現(xiàn) InitializingBean、DisposableBean 接口
這2個接口,會要求你實現(xiàn)2個方法

@Component
public class BeanSelf implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("destroy");
    }
}

afterPropertieseSet 會在屬性設(shè)置完畢,調(diào)用,這里的屬性設(shè)置,指的是Bean的依賴注入。比如。在 BeanSelf中注入 BeanSelf2

private BeanSelf2 beanSelf2
@Autowired
public void setBeanSelf2(BeanSelf2 beanSelf2) {
    System.out.println("注入BeanSelf2");
    this.beanSelf2 = beanSelf2
}

運行結(jié)果

注入 beanSelf2
afterPropertiesSet
destroy

1.2、使用 @PostConstruct、 @PreDestroy 注解
正如其名:在構(gòu)造器之后, 即在銷毀之前。

public class BeanSelf implements InitializingBean, DisposableBean{

    private BeanSelf2 beanSelf2;
    private BeanSelf3 beanSelf3;

    public BeanSelf(BeanSelf2 beanSelf2) {
        System.out.println("構(gòu)造器注入 beanSelf2");
        this.beanSelf2 = beanSelf2;
    }

    @Autowired
    public void setBeanSelf3(BeanSelf3 beanSelf3) {
        System.out.println("屬性注入 beanSelf3");
        this.beanSelf3 = beanSelf3;
    }

    @PostConstruct
    public void init() {
        System.out.println("PostConstruct");
    }

    @PreDestroy
    public void initDestroy2() {
        System.out.println("PreDestroy");
    }
    
     @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }
    
    @Override
    public void destroy() throws Exception {
        System.out.println("destroy");
    }
}

運行效果

構(gòu)造器注入 beanSelf2
屬性注入 beanSelf3
PostConstruct   --- 很明顯 @PostConstruct 是在構(gòu)造器之后注入 beanSelf2
afterPropertiesSet --- 在 PostConstruct 之后
PreDestroy   --- 很明顯,是在銷毀之前調(diào)用的
destroy

小總結(jié):不管是@PostConstruct 或者 實現(xiàn)InitializingBean接口。 都是在Bean實例化完成之后才調(diào)用的。

2、beanFactory工廠接口,只調(diào)用一次

@Component
public class MyBeanFactory implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        Iterator iterator = configurableListableBeanFactory.getBeanNamesIterator();
        BeanSelf2 beanSelf = (BeanSelf2) configurableListableBeanFactory.getBean("beanSelf2");
        beanSelf.add();
        System.out.println("beanFactoryPostProcessor");
    }
}

@Component
public class BeanSelf2 implements InitializingBean{

    public void add() {
        System.out.println("add");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("beanSelf2 afterPropertiesSet");
    }
}

這個接口的方法會在實例化之前調(diào)用。 在postProcessBeanFactory 中,對BeanSelf2提前進(jìn)行初始化,并調(diào)用add方法。

beanSelf2 afterPropertiesSet  -- 調(diào)用beanSelf2的afterPropertiesSet方法 
add 
beanFactoryPostProcessor
構(gòu)造器注入 beanSelf2
屬性注入 beanSelf3
PostConstruct
afterPropertiesSet
PreDestroy

BeanFactoryPostProcessor 顧名思義,在這個方法里面可以拿到所有裝載的Bean,并在初始化之前對某些Bean進(jìn)行修改。(此時Bean還未初始化)

3、BeanPostProcessor接口在每個Bean實例之前,都會調(diào)用。如果Bean已實例化則不會diaoy

@Component
public class MyBeanPostProcessor implements BeanPostProcessor{
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName +"  =  postProcessBeforeInitialization" );
        if("beanSelf2".equals(beanName)) {
            return null;
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName +"  =  postProcessAfterInitialization");
        return bean;
    }
}

上面這段代碼的意思是,在初始化之前,將BeanSelf2 和 BeanSel3 置為null。但是,BeanSelf2不會走到這段代碼內(nèi),因為在接口BeanFactoryPostProcessor 中,將BeanSelf2提前初始化了。所以輸出結(jié)果如下

beanSelf2 afterPropertiesSet  --- BeanFactoryPostProcessor中提前初始化
add                        ---  調(diào)用BeanSelf2的add方法
beanFactoryPostProcessor   --- 在postProcessBeanFactory 中打印
beanConfig  =  postProcessBeforeInitialization  --調(diào)用 BeanPostProcessor
beanConfig  =  postProcessAfterInitialization   --調(diào)用 BeanPostProcessor
BeanSelf  構(gòu)造器注入 beanSelf2                   --BeanSelf 構(gòu)造器注入屬性
beanSelf3  =  postProcessBeforeInitialization  -- 在實例化之前調(diào)用 
BeanSelf  屬性注入 beanSelf3                    -- 注入之前,BeanSelf3還沒實例化,所以在之前調(diào)用 BeanPostProcessor
beanSelf  =  postProcessBeforeInitialization   --- beanSelf 在屬性設(shè)置完畢后,即初始化完畢 調(diào)用 BeanPostProcessor#postProcessBeforeInitialization()
BeanSelf  PostConstruct  --  調(diào)用被 @PostConstruct 注解聲明的方法
afterPropertiesSet     -- 調(diào)用 InitializingBean 接口實現(xiàn)的方法
beanSelf  =  postProcessAfterInitialization
beanSelf2 com.xhn3.BeanSelf2@33cb5951
beanSelf3 null      -- 在BeanPostProcessor中返回null。所以這邊是null
BeanSelf  PreDestroy
destroy

小總結(jié):BeanPostProcessor#postProcessBeforeInitialization在init-method之前調(diào)用,在屬性設(shè)置完畢后調(diào)用。BeanPostProcessor#postProcessAfterInitialization 在InitializingBean#afterPropertiesSet后調(diào)用。

4、BeanDefinitionRegistryPostProcessor 注冊Bean的接口,在BeanFactoryPostProcesso前調(diào)用

@Component
public class MyBeanRegister implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
   
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
}

在該方法里面可以直接注冊bean。可以提前實例化Bean

運行流程:

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69655.html

相關(guān)文章

  • Spring Aware 到底是什么?

    摘要:代碼示例自定義實現(xiàn)注冊運行和預(yù)想一樣,輸出結(jié)果為,如果移除掉注解的屬性,輸出結(jié)果為總結(jié)在大多數(shù)情況下,我們應(yīng)該避免使用任何接口,除非我們需要它們。 showImg(https://segmentfault.com/img/remote/1460000019807821?w=1920&h=1080); 通過如下前序兩篇文章: Spring Bean 生命周期之我從哪里來? Spring...

    mingzhong 評論0 收藏0
  • Spring詳解2.理解IoC容器

    摘要:目前建議使用與。入?yún)⑹钱?dāng)前正在處理的,是當(dāng)前的配置名,返回的對象為處理后的。如果,則將放入容器的緩存池中,并返回。和這兩個接口,一般稱它們的實現(xiàn)類為后處理器。體系結(jié)構(gòu)讓容器擁有了發(fā)布應(yīng)用上下文事件的功能,包括容器啟動事件關(guān)閉事件等。 點擊進(jìn)入我的博客 1 如何理解IoC 1.1 依然是KFC的案例 interface Burger { int getPrice(); } in...

    Ververica 評論0 收藏0
  • Spring IOC知識點一網(wǎng)打盡!

    摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統(tǒng)一配置,便于修改。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 工廠模式理解了沒有? 在刷Spring書籍的時候花了點時間去學(xué)習(xí)了單例模式和工廠模式,總的來說還是非常值得的! 本來想的是刷完《Spring 實戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實戰(zhàn)》...

    djfml 評論0 收藏0
  • Spring之旅第二站:bean、新特性。。。

    摘要:除了,還簡單介紹了對的支持,可以幫助應(yīng)用將散落在各處的邏輯匯集于一處切面。當(dāng)裝配的時候,這些切面能夠運行期編織起來,這樣就能呢個非常有效的賦予新功能。 第1章 Spring之旅 說明 1、本文參考了《Spring 實戰(zhàn)》重點內(nèi)容,參考了GitHub上的代碼 2、每個人的學(xué)習(xí)方式不一樣,但目的是一樣的,活學(xué)活用。最近一直在聽《我們不一樣》 3、本文只為記錄作為以后參考,要想真正領(lǐng)悟Sp...

    luodongseu 評論0 收藏0
  • Spring Bean 生命周期之destroy——終極信仰

    摘要:上一篇文章生命周期之我從哪里來說明了我是誰和我從哪里來的兩大哲學(xué)問題,今天我們要討論一下終極哲學(xué)我要到哪里去初始化有三種方式銷毀同樣有三種方式正所謂,天對地,雨對風(fēng)對對對雷隱隱,霧蒙蒙山花對海樹,赤日對蒼穹平仄平仄平平仄,仄平仄平仄 上一篇文章 Spring Bean 生命周期之我從哪里來 說明了我是誰? 和 我從哪里來? 的兩大哲學(xué)問題,今天我們要討論一下終極哲學(xué)我要到哪里去?sho...

    JouyPub 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<