天天看点

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简直一模一样。

未完待续。

继续阅读