Spring注解驱动开发-生命周期(二)
关联文章:
@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这个接口的实现类
- 【视频分享】尚硅谷Java视频教程_Spring注解驱动开发视频教程
- Spring基于xml配置与注解驱动开发(二)
- Spring 注解驱动开发
- 一步一步实现Spring4 + Hibernate4 + Freemarker2 的注解驱动开发(三.应用代码)
- Spring注解驱动开发-属性赋值&自动装配(三)
- Spring注解驱动开发-AOP(四)
- 一步一步实现Spring4 + Hibernate4 + Freemarker2 的注解驱动开发(四.页面及小结)
- Spring基于xml配置与注解驱动开发(一)
- 一步一步实现Spring4 + Hibernate4 + Freemarker2 的注解驱动开发(一. 环境搭建)
- 一步一步实现Spring4 + Hibernate4 + Freemarker2 的注解驱动开发(二.应用配置)
- 使用 Spring 2.5 基于注解驱动的 Spring MVC
- WEB开发框架配置文件和各层注解(SpringMVC + Spring + Hibernate)
- Spring使用AspectJ进行AOP的开发:注解方式
- Spring再学习-Aop注解开发(三)
- Spring 之 IOC 注解开发详解
- Spring注解开发
- 使用 Spring 2.5 基于注解驱动的 Spring MVC(三)
- Spring注解开发-属性依赖注入
- Spring + Spring MVC + Hibernate项目开发集成(注解)
- spring 3.05 + spring 3.05 mvc + mybatis (注解驱动) maven整合应用示例