第一种方式:指定初始化和销毁方法,通过@Bean指定init-method和destory-method
public class Car {
@Configuration public class @Bean(initMethod = "init",destroyMethod = "destory"public return new } }
@Test public void AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.classSystem.out.println("容器创建完成"Object bean = applicationContext.getBean(Car.classSystem.outapplicationContext.close(); } 输出结果: 调用Car类的构造方法。。。。 调用Car init方法。。。。。 容器创建完成 com.jbit.pojo.Car@1460a8c0 调用Car类的销毁方法。。。。。 |
第二种方式:通过接口InitialiaingBean(定义初始化逻辑),通过接口DisposableBean(定义销毁逻辑)
@Component public class Cat implements public void destroy() throws out.println("Cat类销毁方法启动。。。。。"} public void afterPropertiesSet() throws System.out.println("Cat类初始化方法启动。。。。"} }
@ComponentScan(value="com.jbit.pojo") @Configuration public class @Bean(initMethod = "init",destroyMethod = "destory"public return new } }
@Test public void AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.classObject bean = applicationContext.getBean(Cat.classSystem.out.println(bean.getClass()); } 输出结果: Cat类初始化方法启动。。。。 调用Car类的构造方法。。。。 调用Car init方法。。。。。 class com.jbit.pojo.Cat |
第三种方式:使用JSR250
@PostConstruct,在Bean创建完成并且属性赋值完成,来执行初始化。
@PreDestory,在容器销毁Bean之前通知我们进行清理工作。
public class public out.println("Dog.....构造方法被调用。。。。。"} public void System.out.println("Dog。。。。初始化方法被调用。。。。"} public void System.out.println("Dog....销毁方法被调用。。。。。"} }
@ComponentScan(value="com.jbit.pojo") @Configuration public class @Bean(initMethod = "init",destroyMethod = "destory"public return new } public return new } }
@Test public void AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.classObject bean = applicationContext.getBean(Dog.classSystem.out.println(bean.getClass()); } 输出结果: Cat类初始化方法启动。。。。 调用Car类的构造方法。。。。 调用Car init方法。。。。。 Dog.....构造方法被调用。。。。。 Dog。。。。初始化方法被调用。。。。 class com.jbit.pojo.Dog |
第四种方式:
使用接口BeanPostProcessor,Bean的后置处理器,在Bean的初始化前后做一些工作
PostProcessBeforeInitialization():在任何Bean初始化之前进行工作
postProAfterInitialization():在初始化之后进行工作
/** * 后置处理器,在所有Bean* */ @Component//将后置处理器加入到容器中 public class MyBeanPostProcessor implements public Object postProcessBeforeInitialization(Object o, String s) throws System.out.println("postProcessBeforeInitialization...."+"beanName:"return } public Object postProcessAfterInitialization(Object o, String s) throws System.out.println("postProcessAfterInitialization...."+"beanName:"return } } @ComponentScan(value="com.jbit.pojo")//将后置处理器,扫描进IOC容器中 @Configuration public class @Bean(initMethod = "init",destroyMethod = "destory"public return new } public return new } 启动测试 @Test public void AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); } 输出信息: postProcessBeforeInitialization....beanName:org.springframework. context.event.internalEventListenerProcessor postProcessAfterInitialization....beanName:org.springframework. context.event.internalEventListenerProcessor postProcessBeforeInitialization....beanName:org.springframework. context.event.internalEventListenerFactory postProcessAfterInitialization....beanName:org.springframework. context.event.internalEventListenerFactory postProcessBeforeInitialization....beanName:mainConfigOfLifeCycle postProcessAfterInitialization....beanName:mainConfigOfLifeCycle postProcessBeforeInitialization....beanName:cat Cat类初始化方法启动。。。。 postProcessAfterInitialization....beanName:cat 调用Car类的构造方法。。。。 postProcessBeforeInitialization....beanName:car 调用Car init方法。。。。。 postProcessAfterInitialization....beanName:car Dog.....构造方法被调用。。。。。 postProcessBeforeInitialization....beanName:dog Dog。。。。初始化方法被调用。。。。 postProcessAfterInitialization....beanName:dog
观察以上结果可见,spring的后置处理器将会在IOCp容器中每个Bean初始化前后进行工作。 执行方式: 遍历得到容器所有的BeanPostProcessor,挨个执行beforeInitialization,一旦返回null,跳出for循环,不会执行后面的BeanPostProcessor. postProcessBeforeInitialization()方法。(参见源码!) |
Processor的其它用法
//返回applicationContex获取IOC容器 public class Dog implements //实现ApplicationContextAware接口返回private ApplicationContext applicationContextpublic System.out.println("Dog.....构造方法被调用。。。。。"} public void System.out.println("Dog。。。。初始化方法被调用。。。。"} public void System.out.println("Dog....销毁方法被调用。。。。。"} //实现ApplicationContextAware接口返回public void setApplicationContext(ApplicationContext applicationContext) throws this.applicationContext } } |
Spring底层对PostProcessor的运用
BeanValidationPostProcessor:进行数据校验
InitDestroyAnnotationBeanPostProcessor:寻找初始化注解与销毁注解,执行。
AutowiredAnnotationBeanPostProcessor:处理@Autowrited注解。
Bean赋值。注入其它组件,@AutoWrited,生命周期注解功能,@Async,等。。。