Spring 的设计中留给了我们大量的扩展接口供开发者去自定义自己的功能,其中AOP 就是在 Spring 预留的扩展接口中实现的,所以说只要遵守 Spring 对扩展接口的约定,那么就能实现自己想要的功能。那么我们具体来看一下都有哪些扩展接口。
1.FactoryBean(Aop就是通过这个接口来实现的),我们看一下这个接口里面的方法:
public interface FactoryBean {
//返回对象实例
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