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