关于在spring 容器初始化bean和销毁前所做的操作定义方式有三种:
第一种:通过注解@PostConstruct和@PreDestroy方法实现初始化和销毁豆之前进行的操作
进口javax.annotation.PostConstruct; 进口javax.annotation.PreDestroy; 公开课DataInitializer { @PostConstruct 公共空间initMethod()抛出异常{ system . out。println (“initMethod被执行”); } @PreDestroy 公共空间destroyMethod()抛出异常{ system . out。println (“destroyMethod被执行”); } }
第二种是:通过在xml中定义init方法和,destory-method方法
公开课DataInitializer { 公共空间initMethod()抛出异常{ system . out。println (“initMethod被执行”); } 公共空间destroyMethod()抛出异常{ system . out。println (“destroyMethod被执行”); } }
代码如下:
& lt; bean id=癲ataInitializer”类=" com.somnus.demo.DataInitializer " init方法=癷nitMethod destory-method=癲estroyMethod”/祝辞,
第三种是:通过豆实现InitializingBean和DisposableBean接口
进口org.springframework.beans.factory.DisposableBean; 公共类DataInitializer实现InitializingBean DisposableBean { @Override 公共空间afterPropertiesSet()抛出异常{ system . out。println (“afterPropertiesSet被执行”); } @Override 公共空间摧毁()抛出异常{ system . out。println(“摧毁被执行”); } }
,其中第一种和第二种是同一种形式,只不过一种xml配置,另外一种采用注解形式罢了,有很大区别的是第三种,如果同一个bean同时采用两种方式初始化的时候执行某个方法,首先在执行顺序上就会体现出来。
先执行afterPropertiesSet(),后执行initMethod ()
这里我们看下源码
这方式在春天中是怎么实现的?
通过查看春天的加载bean的源码类(AbstractAutowireCapableBeanFactory)可看出其中奥妙
AbstractAutowireCapableBeanFactory类中的invokeInitMethods讲解的非常清楚,源码如下:
保护无效invokeInitMethods (String beanName、最终对象bean, RootBeanDefinition mbd) {抛出Throwable//判断该bean是否实现了实现了InitializingBean接口,如果实现了InitializingBean接口,则只掉调用bean的afterPropertiesSet方法 布尔isInitializingBean=(bean实例InitializingBean); 如果(isInitializingBean,,(mbd==null | | ! mbd.isExternallyManagedInitMethod (“afterPropertiesSet”))) { 如果(logger.isDebugEnabled ()) { logger.debug(“调用afterPropertiesSet()在bean名称+ beanName +“”); } 如果(System.getSecurityManager () !=null) { 尝试{ AccessController。doPrivileged(新的PrivilegedExceptionAction