您的位置:首页 > 编程语言 > Java开发

Spring注解驱动开发-生命周期(二)

2019-03-04 09:53 411 查看

关联文章:

Spring注解驱动开发-组件注册(一)

Spring注解驱动开发-生命周期(二)

Spring注解驱动开发-属性赋值&自动装配(三)

Spring注解驱动开发-AOP(四)

@Bean指定初始化和销毁方法

bean的生命周期:bean创建--初始化--销毁 的过程

IOC容器管理bean的生命周期

我们可以自定义初始化和销毁方法,容器bean进行到当前生命周期的时候调用我们自定义的初始化和销毁方法啊

构造(对象创建)

        单实例:在容器启动时创建对象

        多实例:在每次获取bean的时候创建对象

初始化:

       对象创建完成,并赋值好,调用初始化方法

销毁:

      单实例:容器关闭的时候调用销毁方法

      多实例:容器不管理这个Bean,所以不回调用销毁方法

1.指定初始化和销毁方法

通过@Bean指定init-method和destory-method

配置类:

[code]@Configuration//这是一个配置类
public class MainConfigOfLifeCycle {
@Bean(initMethod="init",destroyMethod="destory")
public Car car() {
return new Car();
}
}

测试:

[code]public class IOCTest_LifeCycle {
@Test
public void test1() throws Exception {
//1.创建IOC容器
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成...");
//关闭容器
ac.close();
}
}

单实例结果:

多实例 结果:

配置类:

[code]@Configuration//这是一个配置类
public class MainConfigOfLifeCycle {
@Scope("prototype")
@Bean(initMethod="init",destroyMethod="destory")
public Car car() {
return new Car();
}
}

当IOC容器创建好并没有获取bean对象时,是不会创建对象的,也不会调用方法

当获取bean的时候,就会创建对象,调用初始化方法,由于IOC容器不管理多实例的bean所以不会调用销毁方法

[code]public class IOCTest_LifeCycle {
@Test
public void test1() throws Exception {
//1.创建IOC容器
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成...");
//获取bean
ac.getBean("car");
//关闭容器
ac.close();
}
}

结果:

2.让bean实现InitializingBean接口(定义初始化逻辑)和DisposableBean接口(定义销毁逻辑)

组件:

[code]@Component
public class Car implements InitializingBean, DisposableBean {
public Car() {
System.out.println("Car...construct");
}

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

}

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

配置类

[code]@Configuration//这是一个配置类
@ComponentScan("com.zxc.bean")
public class MainConfigOfLifeCycle {
}

测试

[code]public class IOCTest_LifeCycle {
@Test
public void test1() throws Exception {
//1.创建IOC容器
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成...");
//关闭容器
ac.close();
}
}

结果

3.可以使用JSR250

   @PostConstruct:在bean创建完成并且属性赋值完成,来执行初始化方法

   @PreDestory:在容器销毁bean之前通知我们进行清理

组件:

[code]public class Dog {
public Dog() {
System.out.println("Dog...construct");
}

@PostConstruct//在创建对象,赋值后调用
public void init() {
System.out.println("Dog.init()");
}

@PreDestroy //在销毁之前调用
public void destory() {
System.out.println("Dog.destory()");
}
}

配置类:

[code]@Configuration//这是一个配置类
@Import(Dog.class)
public class MainConfigOfLifeCycle {

}

结果:

4.BeanPostProcessor接口,bean的后置处理器

    在bean初始化前后完成一些处理工作

    postProcessBeforeInitialization方法:在初始化之前进行工作

    postProcessAfterInitialization方法:   在初始化之后进行工作

[code]public class MyBeanPostProcessor implements BeanPostProcessor {

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

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

}

配置类:

[code]@Configuration//这是一个配置类
@Import({Dog.class,MyBeanPostProcessor.class})
public class MainConfigOfLifeCycle {

}

结果:

[code]postProcessBeforeInitialization()...org.springframework.context.event.internalEventListenerProcessor-->org.springframework.context.event.EventListenerMethodProcessor@7181ae3f
postProcessAfterInitialization()...org.springframework.context.event.internalEventListenerProcessor-->org.springframework.context.event.EventListenerMethodProcessor@7181ae3f
postProcessBeforeInitialization()...org.springframework.context.event.internalEventListenerFactory-->org.springframework.context.event.DefaultEventListenerFactory@6e2c9341
postProcessAfterInitialization()...org.springframework.context.event.internalEventListenerFactory-->org.springframework.context.event.DefaultEventListenerFactory@6e2c9341
postProcessBeforeInitialization()...mainConfigOfLifeCycle-->com.zxc.config.MainConfigOfLifeCycle$$EnhancerBySpringCGLIB$$600b1690@32464a14
postProcessAfterInitialization()...mainConfigOfLifeCycle-->com.zxc.config.MainConfigOfLifeCycle$$EnhancerBySpringCGLIB$$600b1690@32464a14
Dog...construct
postProcessBeforeInitialization()...com.zxc.bean.Dog-->com.zxc.bean.Dog@76a4d6c
Dog.init()
postProcessAfterInitialization()...com.zxc.bean.Dog-->com.zxc.bean.Dog@76a4d6c
容器创建完成...
Dog.destory()

BeanPostProcessor原理

AbstractAutowireCapableBeanFactory:

[code]  protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd)
{
Object wrappedBean = bean;
if(mbd == null || !mbd.isSynthetic())
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
try
{
invokeInitMethods(beanName, wrappedBean, mbd); //调用初始化方法
}

if(mbd == null || !mbd.isSynthetic())
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
return wrappedBean;
}

 进入pplyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)方法;
遍历得到所有的BeanPostProcessor,挨个执行beforeInitialization,一旦返回null,跳出循环,不会执行后面的postProcessBeforeInitialization

[code]   public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException
{
Object result = existingBean;
for(Iterator iterator = getBeanPostProcessors().iterator(); iterator.hasNext();)
{
BeanPostProcessor beanProcessor = (BeanPostProcessor)iterator.next();
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
if(result == null)
return result;
}

return result;
}

Spring底层对

BeanPostProcessor
的使用

Bean赋值、注入其他组件、@Autowired、生命周期注解功能、@Async等等都使用到了BeanPostProcessor这个接口的实现类

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: