Spring註解專題系類(二)

Spring註解應用篇--IOC容器Bean生命週期

這是Spring註解專題系類文章,本系類文章適合Spring入門者或者原理入門者,小編會在本系類文章下進行企業級應用實戰講解以及spring源碼跟進。
本文來自公衆號:B一下爪哇

環境準備

  • 編譯器IDEA
  • maven依賴spring-context version:4.3.12.RELEASE
  • maven依賴junit version:4.11

Bean註解來指定bean初始化和銷燬方法

前面一章提過,在配置類中經過@Bean來將組件注入到容器中,在容器中,Bean的生命週期大抵上能夠分爲建立--初始化--銷燬的過程,容器管理着組件的所有生命週期。Bean註解源碼裏面包含initMethod和destroyMethod兩個屬性,能夠分別來自定義bean的初始化方法和銷燬方法。
自定義格式:spring

@Bean(initMethod=,destoryMethod=)

測試:
先在Bean中自定義初始化和銷燬方法:maven

public class ExampleBean {
    private String name;
    private int age;
.....
public void init(){
        System.out.println("ExampleB init...");
    }
    public void destory(){
        System.out.println("Example destory...");
    }
}

配置類:ide

@Configuration
public class BaseConfig {
    @Bean(value="beanIdDefinition",initMethod = "init",destroyMethod = "destory")
    public ExampleBean exampleBean(){
        return new ExampleBean();
    }
}

測試類:post

@Test
    public void shouldAnswerWithTrue()
    {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BaseConfig.class);
        System.out.println("IOC容器建立完成...");
        String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
        ctx.close();
    }

output:測試

exampleBean constructor......
ExampleB init...
IOC容器建立完成...
Example destory...

由此可知,在容器初始化過程當中已經完成對bean的初始化工做,而且在容器關閉途中,調用bean的銷燬方法。(下一章分析容器初始化大體作了哪一些工做)spa

InitializingBean和DisposableBean接口指定Bean初始化和銷燬方法

InitializingBean的afterPropertiesSet在設置提供Bean的屬性值後由BeanFactory調用進行方法調用。
DisposableBean的destory在Bean單例被破壞時由BeanFactory進行方法調用。
定義Bean並實現這兩個接口code

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

    @Override
    public void destroy() throws Exception {
        System.out.println("LifeCycleBean destory....");
    }
}

output:接口

LifeCycleBean afterPropertieSet....
IOC容器建立完成...
LifeCycleBean destory....

PostConstruct & PreDestory註解

JSR是Java Specification Requests的縮寫,意思是Java 規範提案。
JSR250已經添加至Java SE6中,經常使用的大概就是PostConstruct初始化、PreDestory銷燬、Resource資源等。
Spring支持JSR250的註解。PostConstruct在bean建立完成而且屬性賦值完成;來執行初始化方法;PreDestory在容器銷燬bean以前回調通知;Resource支持bean自動裝配,相似Autowired。
使用方式,在Bean中直接添加:生命週期

@PostConstruct
    public void initPost(){
        System.out.println("ExampleBean JSR250 PostConstruct...");
    }

    @PreDestroy
    public void destoryPre(){
        System.out.println("ExampleBean JSR250 PreDestory...");
    }

測試output:圖片

exampleBean constructor......
ExampleBean JSR250 PostConstruct...
IOC容器建立完成...
ExampleBean JSR250 PreDestory...

BeanPostProcessor後置處理器

BeanPostProcessor【接口】:bean後置處理器在Bean的生命週期起到一個承上啓下的做用,在Bean初始化先後進行處理工做。

  • PostProcessorBeforeInitialization方法:在初始化方法調用以前調用;
  • postProcessorBefore方法:在bean初始化方法調用以後工做

兩個方法都包含2個相同的參數:
@param Object o:Bean實例
@param String s:beanName

定義一個Bean實現後置處理器接口:

public class BeanPostProcessorDefinition implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("postProcessBeforeInitialization -->"+s+" = "+o);
        return o;
    }

    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("postProcessorAfterInitialization -->"+s+"="+o);
        return o;
    }
}

以容器中存在的id爲exampleBean的bean爲例:查看output:

//部分容器初始化的一些bean
exampleBean constructor......
postProcessBeforeInitialization -->exampleBean = ExampleBean{name='null', age=0}
ExampleBean JSR250 PostConstruct...
postProcessorAfterInitialization -->exampleBean=ExampleBean{name='null', age=0}
IOC容器建立完成...

由此不可貴出,在容器初始化過程當中,大體依次完成bean的建立,實例化,屬性賦值,執行bean後置處理器初始化以前的方法,執行初始化方法,執行bean後置處理器初始化以後的方法。

圖片描述

相關文章
相關標籤/搜索