1.InitializingBean接口
- InitializingBean接口中只有一个方法afterPropertiesSet(),这个方法是在bean的属性都设置值后被调用,用于完成一些初始化工作。
- 在spring的配置文件中init-method的配置、@PostConstruct注解 也是跟InitializingBean接口的afterPropertiesSet()方法同样作用
- 三种方式的执行顺序:先注解,然后执行InitializingBean接口中定义的方法,最后执行init-method指定的方法。
- 这三种方式都是在bean属性设置后做一下特殊处理,用于完成 一些初始化工作,所以在方法中不要编写复杂且执行时间很长的逻辑。
2.DisposableBean接口
- DisposableBean接口中只有一个destory方法,该方法会在bean销毁,生命周期结束之前被调用,用于一些销毁的收尾工作。
- 在spring的配置文件中destory-method方法,@PreDestory注解与DisposableBean接口的destory方法同样的作用
- 三种方式的执行顺序,先注解,然后执行DisposableBean接口的destory方法,最后执行destory-method方法
3.ApplicationContextAware接口
- ApplicationContextAware接口中只有一个setApplicationContext方法,实现了该接口的bean,可以在该bean的加载过程中获取spring的上下文ApplicationContext,通过ApplicationContext可以获取更多的spring容器内的信息。
4.BeanFactoryAware接口
- BeanFactoryAware接口中只有一个setBeanFactory方法,实现了该接口的bean,可以在该bean的加载过程中获取加载该bean的beanFactory,从而可以获取该beanFactory中加载的其他bean。
5.FactoryBean接口
- 当spring容器在中的bean实现了该接口后,通过getBean(String beanName)获取到的bean对象并不是FactoryBean实现类对象,而是这个实现类中getObject()方法返回的对象。
- 要想获得FactoryBean实现类的对象,使用getBean(&beanName)
- FactoryBean#getObject()方法所返回的对象,相当于FactoryBean#getObject()代理了getBean(beanName)方法,
- spring中aop,使用ProxyFactoryBean方式实现,其中ProxyFactoryBean就实现了FactoryBean接口
6.BeanPostProcessor接口
- BeanPostProcessor中有两个方法,postProcessBeforInitialization和postProcessAfterInitialization,会在spring中每个bean的初始化方法前后调用实现了该接口的类的这两个方法,添加一些自己的处理逻辑。
- 初始化方法包括,实现了InitializingBean接口对应afterPropertiesSet、spring中配置的init-method方法、@PostConstruct注解的方法。
- spring中大部分注解解析器大部分是通过实现BeanPostProcessor接口来实现的。
7.InstantiationAwareBeanPostProcessor接口
- 有三个方法,postProcessBeforeInstantiation、postProcessAfterInstantiation、postProcessPropertyValues。
- 会在每个bean实例化(即调用构造函数)之前、之后调用实现了该接口的类的postProcessBeforeInstantiation、postProcessAfterInstantiation方法
- 典型用于替换bean的默认创建方式,例如aop通过扩展接口生成代理对应,主要用于基础框架层面;如果日常业务中需要扩展,推荐使用InstantiationAwarePostProcessorAdpater
- 如果postProcessBeforeInstantiation返回bean(典型的aop返回proxy对象),则初始化流程缩短,只会执行BeanPostProcessor的postProcessAfterInitialization接口直接完成初始化;否则执行顺序postProcessBeforeInstantiation->构造方法->postProcessAfterInstantiation->postProcessBeforeInitialization->@PostConstruct->afterPropertiesSet->init-method->postProcessAfterInitialization
- postProcessProperties调用时机为postProcessAfterInstantiation执行之后并返回true, 返回的PropertyValues将作用于给定bean属性赋值.
spring容器中的bean先实例化,而后设置属性,最后初始化;实例化是调用构造函数,初始化是调用初始化方法;
8.BeanFactoryPostProcessor接口
- 只有postProcessBeanFactory一个方法
- 实在该接口的类,可以在Bean被创建之前,获取容器中Bean的定义信息,并可以进行修改,实现类中的方法只会被执行一次,且先于BeanPostProcessor接口中的方法。
9.ApplicationListener接口
- 只有onApplicationEvent一个方法(与ApplicationEvent一起构成观察者模式)
- 实现该接口的类,在ApplicationContext发布ApplicationEvent时,回调onApplicationEvent方法
- dubbo中的服务发布就是使用该接口发布服务的(Service.java)