spring源码:spring生命周期中重要的接口类
Posted Small leaf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring源码:spring生命周期中重要的接口类相关的知识,希望对你有一定的参考价值。
spring启动后会有很有接口穿插在spring生命周期当中,熟练的了解这些,对我们读其他框架源码,或者自己写框架集成spring非常有帮助。
1.BeanDefinitionRegistryPostProcessor
扩展了BeanFactoryPostProcessor ,能够在BeanFactoryPostProcessor 检测之前执行,并且它也是BeanFactoryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
//在BeanFactoryPostProcessor 检测之前做一些注册操作,
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
能够在BeanFactoryPostProcessor 之前做一些注册操做,也就是拿到了BeanDefinitionRegistry 那你看有什么方法就能够使用。
2.BeanFactoryPostProcessor
Bean工厂的管理,可以修改bean的属性,可以获得bean的定义做一些列的修改,但是不能与bean的实例化做交互
public interface BeanFactoryPostProcessor
//修改容器的bean工厂的定义, 所有bean定义都将被加载,但尚未实例化任何bean。 这甚至可以覆盖或添加属性,甚至可以用于初始化bean。
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
BeanFactoryPostProcessor是在对象还没有实例化时对对象的定义做修改的。当然我可以利用这个类做一些提前的加载行不行呢?当然可以,在所有的bean还没有实例化之前就执行,比如可以加载一些配置,引入一个自动注解的配置,也是可以的。
3.BeanPostProcessor
在bean初始化前后做一些列操作 初始化就是调用 @PostConstruct,或者afterPropertiesSet,当然还有xml的init方法
public interface BeanPostProcessor
//初始化方法前做一些操作
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
return bean;
//初始化之后做一些操作
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
return bean;
也就是bean已经实例化,我们在它执行初始化方法前后做一些东西。那你告诉我@Autowire能用这个接口吗?可以使用它的实现类,但是不能用这个,为什么呢?再对象初始化的时候我们会使用@Autowire给与的属性值,如果不在实例化之前,可能就会报错。那实例化前后呢?
4.InstantiationAwareBeanPostProcessor
//BeanPostProcessor的子接口,它添加实例化之前的回调,以及在实例化之后但在设置显式属性或发生自动装配之前的回调。
通常用于抑制特定目标Bean的默认实例化,例如创建具有特殊TargetSource的代理(池目标,延迟初始化目标等),或实施其他注入策略,例如字段注入。
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor
//之前做一些操作
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException
return null;
//之后做一些操作
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException
return true;
//实例化之后做一些修改属性的操作
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException
return null;
@Deprecated
@Nullable
default PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException
return pvs;
InstantiationAwareBeanPostProcessor可以在bean实例化前后做一些操作。
5.MergedBeanDefinitionPostProcessor
//能够在bean实例化之后做一些操作
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor
//实例化之后做一些操作
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
default void resetBeanDefinition(String beanName)
对象实例化之后可以得到容器中的RootBeanDefinition ,那么就可以对对bean的实际实例进行后处理之前准备一些缓存的元数据。 还允许修改bean定义,但只允许修改实际上用于并行修改的定义属性。 本质上,这仅适用于RootBeanDefinition本身定义的操作,不适用于其基类的属性。
6.XXXAware接口
在对象实例化之后,初始化之前调用,很明显,初始化时可能需要容器里面的东西。那为什么不是实例化之前调用呢?这个问题问的好,因为spring接口已经很多,需要粒度小点。实例化之前有其他接口可以做。但是Aware不一定实例化都需要对不对?
7.SmartInitializingSingleton
//在所有的bean初始化后做一些操作
public interface SmartInitializingSingleton
void afterSingletonsInstantiated();
比如一个rpc服务,rpc服务是一个接口服务,rpc启动了只要有请求就会立马调用容器里面的service,此时如果容器都还没有初始化好,是不是会报错?
8.Lifecycle
定义启动/停止生命周期控制方法的通用接口。典型的用例是控制异步处理。注意:此接口并不意味着特定的自动启动语义。考虑为此目的实施SmartLifecycle。
可以由组件(通常是在Spring上下文中定义的Spring bean)和容器(通常是Spring ApplicationContext本身)实现。容器会将开始/停止信号传播到每个容器中应用的所有组件,例如在运行时停止/重新启动的情况。
可以用于直接调用或通过JMX进行管理操作。在后一种情况下,通常将使用org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler定义org.springframework.jmx.export.MBeanExporter,从而将活动控制的组件的可见性限制为Lifecycle接口。
请注意,当前的Lifecycle接口仅在顶级单例bean上受支持。在任何其他组件上,Lifecycle接口将保持未被检测到并因此被忽略。另外,请注意,扩展的SmartLifecycle接口提供了与应用程序上下文的启动和关闭阶段的复杂集成。
public interface Lifecycle
void start();
void stop();
boolean isRunning();
定义了spring容器启动结束时候做的一些操作,比如说,容器启动异步产生一个监听器,结束也执行一个方法,用来做这些事情。
9.SmartLifecycle
public interface SmartLifecycle extends Lifecycle, Phased
SmartLifecycle继承了Lifecycle,和Phased
getPhase就是说SmartLifecycle执行start的优先级,SmartLifecycle getPhase 返回Integer.MAX_VALUE那是不是容器所以的都执行完了再执行。
也就是我们可以利用SmartLifecycle来进行容器初始化完成后的操作,比如说rpc服务启动。
10.ImportSelector
实现这个接口可以根据自己的筛选原则,来决定哪个@Configuration能够被导入。这个接口也可以实现Aware的接口,selectImports方法在Aware对应的方法后面执行。
public interface ImportSelector
String[] selectImports(AnnotationMetadata importingClassMetadata);
11.DeferredImportSelector
DeferredImportSelector这个实现的类会执行当所有的@Configuration注解的bean被处理后执行。这个类主要是用来处理@Conditional的。我们也可以用 @Ordered 决定多个 DeferredImportSelector 的执行顺序。
12.ImportBeanDefinitionRegistrar
由在处理@Configuration类时注册其他bean定义的类型所实现的接口。 在bean定义级别(与@Bean方法/实例级别相对)进行操作时很有用,这是必需的或必需的。
与@Configuration和ImportSelector一起,可以将此类型的类提供给@Import批注(或也可以从ImportSelector返回)。
public interface ImportBeanDefinitionRegistrar
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
这个类就是用来注入一些我们想要的类。也就是我们实现了该接口就可以自己个性化在spring容器当中注入自己想要的类了。
知道了这些接口,大致上的spring注解实现原理,以及其他的框架如何扩展的非常简单,就如我们公司使用的taf框架,从xml配置到spring,springboot简直一模一样。
未完待续。
以上是关于spring源码:spring生命周期中重要的接口类的主要内容,如果未能解决你的问题,请参考以下文章