LifecycleProcessor接口还定义了用于刷新和关闭上下文的回调方法。后者驱动关闭进程,就好像已经显式地调用了stop(),但它是在上下文关闭时发生的。另一方面,“refresh”回调启用了SmartLifecycle bean的另一个特性。当上下文被刷新时(在所有对象被实例化和初始化之后),该回调被调用。此时,默认的生命周期处理器将检查每个SmartLifecycle对象的isAutoStartup()方法返回的布尔值
为同一bean配置的多个生命周期机制,使用不同的初始化方法,调用如下:
1.用@PostConstruct注释的方法
2.由InitializingBean回调接口定义的afterPropertieSet()
3.自定义配置的init()方法
销毁方法的调用顺序相同:
1.用@PreDestroy注释的方法
2.destroy()由DisposableBean回调接口定义
3.自定义配置的destroy()方法
当ApplicationContext创建实现org.springframework.context.ApplicationContextAware接口的对象实例时,将为该实例提供对该ApplicationContext的引用。下面的列表显示了ApplicationContextAware接口的定义:
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
当ApplicationContext创建实现org.springframework.beans.factory.BeanNameAware接口的类时,将为该类提供对其关联对象定义中定义的名称的引用。下面的列表显示BeanNameAware接口的定义
public interface BeanNameAware {
void setBeanName(String name) throws BeansException;
}
回调在正常bean属性填充之后调用,但在初始化回调(如initializengbean、afterPropertiesSet或自定义init方法)之前调用。
除了ApplicationContextAware和BeanNameAware(前面已经讨论过),Spring还提供了一系列感知回调接口,让bean向容器指示它们需要某种基础结构依赖性。一般来说,名称表示依赖项类型。下表总结了最重要的感知接口
再次注意,使用这些接口将您的代码绑定到Spring API,并且不遵循控制反转样式。因此,我们建议将它们用于需要对容器进行编程访问的基础设施bean。
BeanPostProcessor
BeanPostProcessor接口定义回调方法,您可以实现这些方法来提供自己的(或重写容器的默认)实例化逻辑、依赖关系解析逻辑等。如果要在Spring容器完成bean的实例化、配置和初始化之后实现一些自定义逻辑,可以插入一个或多个自定义BeanPostProcessor实现。
可以通过设置order属性来控制这些BeanPostProcessor实例的执行顺序。只有在BeanPostProcessor实现有序接口时才能设置此属性。
package scripting;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {
// simply return the instantiated bean as-is
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean; // we could potentially return any object reference here...
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("Bean '" + beanName + "' created : " + bean.toString());
return bean;
}
}
beanfactorypostprocessor
我们查看的下一个扩展点是org.springframe .bean .factory.config. beanfactorypostprocessor。此接口的语义与BeanPostProcessor的语义相似,但有一个主要区别:BeanFactoryPostProcessor操作bean配置元数据。也就是说,Spring IoC容器允许BeanFactoryPostProcessor读取配置元数据,并可能在容器实例化除BeanFactoryPostProcessor实例之外的任何bean之前更改它
可以通过设置order属性来控制这些BeanFactoryPostProcessor实例的运行顺序。但是,只有在BeanFactoryPostProcessor实现有序接口时才能设置此属性。