深入理解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

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