天天看點

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簡直一模一樣。

未完待續。

繼續閱讀