Spring 容器中的 Bean 是有生命周期的,Bean 的生命周期是指 Bean 建立----> 初始化----> 销毁 的过程,而且 Spring 容许 Bean 在初始化完成后以及销毁前执行特定的操做。 下面是经常使用的三种指定特定操做的方法:java
InitDestroyAnnotationBeanPostProcessor
后置处理器来实现的。这几种配置方式,执行顺序是怎样的呢?咱们经过例子来研究下:git
Bean的列子类:InitBeanAndDestroyBean.javagithub
package com.chenfeng.xiaolyuh.entity; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class InitBeanAndDestroyBean implements InitializingBean, DisposableBean { public String say() { return "Hello!" + this.getClass().getName(); } public InitBeanAndDestroyBean() { System.out.println("执行InitBeanAndDestroyBean构造方法"); } @Override public void destroy() throws Exception { System.out.println("接口-执行InitBeanAndDestroyBeanTest:destroy方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("接口-执行InitBeanAndDestroyBeanTest:afterPropertiesSet方法"); } @PostConstruct public void postConstructstroy() { System.out.println("注解-执行InitBeanAndDestroyBeanTest:preDestroy方法"); } @PreDestroy public void preDestroy() { System.out.println("注解--执行InitBeanAndDestroyBeanTest:preDestroy方法"); } public void initMethod() { System.out.println("XML配置-执行InitBeanAndDestroyBeanTest:init-method方法"); } public void destroyMethod() { System.out.println("XML配置-执行InitBeanAndDestroyBeanTest:destroy-method方法"); } }
Spring配置类MyConfig.javaspring
@Configuration // 声明成配置文件 @ComponentScan("com.chenfeng.xiaolyuh") // 扫描包 public class MyConfig { // 测试Bean的几种初始化和销毁方式,和执行顺序 @Bean(initMethod="initMethod", destroyMethod="destroyMethod") public InitBeanAndDestroyBean initBeanAndDestroyBean() { return new InitBeanAndDestroyBean(); } }
测试类SpringIocTest.java缓存
public class SpringIocTest { // 使用容器 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class, CatEntity.class); @Test public void contextTest() { // 测试Bean的三种初始化、销毁方式和执行顺序 System.out.println(context.getBean(InitBeanAndDestroyBean.class)); } @After public void closeContext() { context.close(); } }
打印结果:框架
执行InitBeanAndDestroyBean构造方法 20:46:58.845 [main] DEBUG org.springframework.context.annotation.CommonAnnotationBeanPostProcessor - Found init method on class [com.xiaolyuh.init.destory.InitBeanAndDestroyBean]: public void com.xiaolyuh.init.destory.InitBeanAndDestroyBean.postConstructstroy() 20:46:58.846 [main] DEBUG org.springframework.context.annotation.CommonAnnotationBeanPostProcessor - Found destroy method on class [com.xiaolyuh.init.destory.InitBeanAndDestroyBean]: public void com.xiaolyuh.init.destory.InitBeanAndDestroyBean.preDestroy() 20:46:58.846 [main] DEBUG org.springframework.context.annotation.CommonAnnotationBeanPostProcessor - Registered init method on class [com.xiaolyuh.init.destory.InitBeanAndDestroyBean]: org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement@318a3b24 20:46:58.846 [main] DEBUG org.springframework.context.annotation.CommonAnnotationBeanPostProcessor - Registered destroy method on class [com.xiaolyuh.init.destory.InitBeanAndDestroyBean]: org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement@a27dd7d7 20:46:58.847 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'initBeanAndDestroyBean' to allow for resolving potential circular references 后置处理器-执行:postProcessBeforeInitialization 方法 处理:initBeanAndDestroyBean 20:46:58.850 [main] DEBUG org.springframework.context.annotation.CommonAnnotationBeanPostProcessor - Invoking init method on bean 'initBeanAndDestroyBean': public void com.xiaolyuh.init.destory.InitBeanAndDestroyBean.postConstructstroy() 注解-执行InitBeanAndDestroyBeanTest:preDestroy方法 20:46:58.850 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name 'initBeanAndDestroyBean' 接口-执行InitBeanAndDestroyBeanTest:afterPropertiesSet方法 20:46:58.851 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Invoking init method 'initMethod' on bean with name 'initBeanAndDestroyBean' XML配置-执行InitBeanAndDestroyBeanTest:init-method方法 后置处理器-执行 执行:postProcessAfterInitialization 方法 处理:initBeanAndDestroyBean 20:46:58.851 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'initBeanAndDestroyBean' 20:46:58.851 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory' 20:46:58.883 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@1838ccb8] 20:46:58.883 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor' 20:46:58.885 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source IOC容器完成初始化----> 打印 Spring 容器中的Bean 开始 org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalRequiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory myConfig initBeanBeanPostProcessor initBeanAndDestroyBean 打印 Spring 容器中的Bean 结束 20:46:58.990 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'initBeanAndDestroyBean' com.xiaolyuh.init.destory.InitBeanAndDestroyBean@5ba88be8 20:46:58.991 [main] INFO org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@5af97850: startup date [Mon Aug 26 20:46:58 CST 2019]; root of context hierarchy 20:46:58.991 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor' 20:46:58.992 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@78691363: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,myConfig,initBeanBeanPostProcessor,initBeanAndDestroyBean]; root of factory hierarchy 20:46:58.992 [main] DEBUG org.springframework.context.annotation.CommonAnnotationBeanPostProcessor - Invoking destroy method on bean 'initBeanAndDestroyBean': public void com.xiaolyuh.init.destory.InitBeanAndDestroyBean.preDestroy() 注解--执行InitBeanAndDestroyBeanTest:preDestroy方法 20:46:58.992 [main] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter - Invoking destroy() on bean with name 'initBeanAndDestroyBean' 接口-执行InitBeanAndDestroyBeanTest:destroy方法 20:46:58.993 [main] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter - Invoking destroy method 'destroyMethod' on bean with name 'initBeanAndDestroyBean' XML配置-执行InitBeanAndDestroyBeanTest:destroy-method方法 关闭IOC容器---->
从执行结果能够看出: ide
若是Bean不是单例的,那么Spring不会去管理Bean,Spring 容器中只会存一个Bean标示。Bean的建立和初始化是在获取Bean的时候发生,而且在再容器关闭时不会调用Bean的销毁方法。非单例状况下,Bean的销毁是依靠GC。spring-boot
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releasespost
spring-boot-student-spring 工程测试
为监控而生的多级缓存框架 layering-cache这是我开源的一个多级缓存框架的实现,若是有兴趣能够看一下下