Spring注解专题系类(二)

栏目: Java · 发布时间: 6年前

内容简介:这是Spring注解专题系类文章,本系类文章适合Spring入门者或者原理入门者,小编会在本系类文章下进行企业级应用实战讲解以及spring源码跟进。前面一章提过,在配置类中通过@Bean来将组件注入到容器中,在容器中,Bean的生命周期大抵上可以分为创建--初始化--销毁的过程,容器管理着组件的全部生命周期。Bean注解源码里面包含initMethod和destroyMethod两个属性,可以分别来自定义bean的初始化方法和销毁方法。

Spring注解应用篇--IOC容器Bean生命周期

这是Spring注解专题系类文章,本系类文章适合Spring入门者或者原理入门者,小编会在本系类文章下进行企业级应用实战讲解以及spring源码跟进。

环境准备

  • 编译器IDEA
  • maven依赖spring-context

    version:4.3.12.RELEASE

  • maven依赖junit

    version:4.11

Bean注解来指定bean初始化和销毁方法

前面一章提过,在配置类中通过@Bean来将组件注入到容器中,在容器中,Bean的生命周期大抵上可以分为创建--初始化--销毁的过程,容器管理着组件的全部生命周期。Bean注解源码里面包含initMethod和destroyMethod两个属性,可以分别来自定义bean的初始化方法和销毁方法。

自定义格式:

@Bean(initMethod=,destoryMethod=)

测试:

先在Bean中自定义初始化和销毁方法:

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...");
    }
}

配置类:

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

测试类:

@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的销毁方法。(下一章分析容器初始化大致做了哪一些工作)

InitializingBean和DisposableBean接口指定Bean初始化和销毁方法

InitializingBean的afterPropertiesSet在设置提供Bean的属性值后由BeanFactory调用进行方法调用。

DisposableBean的destory在Bean单例被破坏时由BeanFactory进行方法调用。

定义Bean并实现这两个接口

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后置处理器初始化之后的方法。

Spring注解专题系类(二)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

O2O进化论

O2O进化论

板砖大余、姜亚东 / 中信出版社 / 2014-5 / 49

在互联网的1.0时代,Online的商业和Offline的商业就像是两条平行线,没有交汇点,在移动浪潮下,他们正在交汇,这就是O2O(Online to Offline)。于是,人们认为:O2O就是线下将线上作为销售前台。结论是对的,但并非简单相加就可以达到。人们已经进入数据革命时期,O2O是线上和线下全流通的数据化工具,电子商务就是非数据商品的数据化。其次,O2O还是一种竞争格局。这决定了以O2......一起来看看 《O2O进化论》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具