深入理解Spring之擴展接口

Spring 的設計中留給了我們大量的擴展接口供開發者去自定義自己的功能,其中AOP 就是在 Spring 預留的擴展接口中實現的,所以說只要遵守 Spring 對擴展接口的約定,那麼就能實現自己想要的功能。那麼我們具體來看一下都有哪些擴展接口。

1.FactoryBean(Aop就是通過這個接口來實現的),我們看一下這個接口裏面的方法:

public interface FactoryBean<T> {
	//返回對象實例
	T getObject() throws Exception;

	//對象的類型
	Class<?> getObjectType();

	//是否單例
	default boolean isSingleton() {
		return true;
	}

}

主要通過getObject方法,實例化一些自定義類(比較複雜的),比如AOP功能,mybatis-spring裏面也有使用。

2.InitializingBean:初始化數據的接口

這個接口裏面有一個方法:afterPropertiesSet,從名稱也能夠看出,這個方法主要是在當前對象的屬性設置完成以後調用的,可以在這裏做一些初始化的工作。跟init-method配置的效果是一致的,不過執行順序上早於init-method。

3.DisposableBean :消費bean的一些操作

這個接口也只有一個方法:destroy,這裏主要是在銷燬之前做一些自己的自定義操作。

4.BeanFactoryPostProcessor:獲取BeanDefinition對象,然後修改對象的元數據

這個接口裏面也是隻有一個方法:postProcessBeanFactory,從名字可以看出,是在對象被創建之前做的操作,而且只會被執行一次, 這裏主要是可以獲取到所有在BeanFactory中的BeanDefinition對象 加以修改對象的元屬性:例如scope

5.Aware接口

5.1BeanNameAware:獲取當親bean的name信息

         void setBeanName(String name);   這裏的name就是當前bean的name

5.2BeanFactoryAware:獲取當前的bean工廠(BeanFactory),然後可以獲取到當前工廠下的所有類,進行操作

        void setBeanFactory(BeanFactory beanFactory) throws BeansException; 這裏的beanFactory就是當前bean工廠

5.3EnvironmentAware:獲取當前的環境(Environment),然後可以獲取到所有的配置文件的信息(Property)

       void setEnvironment(Environment environment);這裏的environment就是當前的環境

5.4ApplicationContextAware:獲取當前的上下文(ApplicationContext),然後可以進行各種自定義操作

        void setApplicationContext(ApplicationContext applicationContext) throws BeansException;這裏applicationContext就是當前的上下文,ApplicationContext又是繼承了BeanFactory,所以這裏其實也是一個bean工廠

6.BeanPostProcessor:在Bean初始化前後做一些操作。

public interface BeanPostProcessor {
	/**
	 * 在bean初始化之前操作
	 */
	Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

	/**
	 * 在bean初始化之後操作
	 */
	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

7.InstantiationAwareBeanPostProcessor:這裏主要是做一些bean實例化之前和之後的操作,而且可以做bean初始化之前和之後的一些操作

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

	/**
	 * 實例化之前操作
	 */
	Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

	/**
	 * 實例化操作之後的操作
	 */
	boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

	/**
	 * 獲取到當前對象的參數信息
	 */
	PropertyValues postProcessPropertyValues(
			PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;

}

8.ApplicationListener:這個接口主要是可以監聽到容器的事件動作,然後做相應的處理

    void onApplicationEvent(E event);這裏獲取到事件event,可以判斷當某個事件發生時,做一些自定義的操作,Dubbo中服務的暴露於發佈就實現了這個接口

9.ImportBeanDefinitionRegistrar:可以註冊自定義Bean到spring容器中

這裏主要是作用在自定義註解上,通過@Import註解進行指定

    /**
	 * @param importingClassMetadata 這裡會包含註解類上的所有參數等信息,可獲取到需要的註解參數值
	 * @param registry 這個是spring的類註冊功能類,可自定義註冊類到springIOC中
	 */
	public void registerBeanDefinitions(
			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);

10.BeanDefinitionRegistryPostProcessor:可以註冊自定義Bean到spring容器中

       void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

總結:1.spring管理類的過程,都是實例化---》初始化

            2.BeanFactoryPostProcessor,InstantiationAwareBeanPostProcessor主要作用在實例化的時候

            3.Aware,InitializingBean,BeanPostProcessor,InstantiationAwareBeanPostProcessor主要作用在初始化的時候

            4.實現BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,InstantiationAwareBeanPostProcessor接口的類要早於普通類先實例化和初始化(按照上面的順序)

            5.對於一個普通類來說

               5.1當啓動時,如果項目中有實現了BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,InstantiationAwareBeanPostProcessor接口,先實例化和初始化(按照上面的順序),並且BeanDefinitionRegistryPostProcessor的方法都會在最開始執行

               5.2實例化當前類的時候,會先走到InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法

               5.3然後調用當前類的構造方法進行實例化

               5.4實例化完成,會先走到InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法

               5.5然後進行當前對象的屬性設置

                       5.5.1如果實現了BeanNameAware接口,會走到setBeanName方法

                       5.5.2如果實現了BeanFactoryAware接口,會走到setBeanFactory方法

                       5.5.3如果實現了EnvironmentAware接口,會走到setEnvironment方法

                       5.5.4如果實現了ApplicationContextAware接口,會走到setApplicationContext方法

               5.6然後在進行初始化之前,會走到BeanPostProcessor的postProcessBeforeInitialization方法

               5.7然後會走到InstantiationAwareBeanPostProcessor的postProcessBeforeInitialization方法

               5.8如果當前類實現了InitializingBean接口,會走到afterPropertiesSet方法

               5.9在初始化完成,會走到BeanPostProcessor的postProcessAfterInitialization方法

               5.10然後走到InstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法

               5.11如果實現了DisposableBean接口,會在銷燬之前走到destroy方法

           6.如果在BeanFactoryPostProcessor的postProcessBeanFactory的方法中,通過BeanFactory獲取了普通類的對象,這個時候會先進行普通類的實例化和初始化,這裏就不會走到InstantiationAwareBeanPostProcessor,BeanPostProcessor的方法中了,因爲這個時候這兩個類還沒有被初始化

            7.如果當前類實現了FactoryBean接口,這裏會先實例化當前對象(先走構造方法,不在InstantiationAwareBeanPostProcessor的實例化前後的方法中間執行了)

           8.FactoryBean->BeanDefinitionRegistryPostProcessor->BeanFactoryPostProcessor->BeanPostProcessor,InstantiationAwareBeanPostProcessor->普通Bean

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章