前言
SpringFramework其实具有很高的扩展性,只是很少人喜欢挖掘那些扩展点,而且官方的Refrence也很少提到那些Hook类或Hook接口
1、Aware接口族
Spring中提供了各种Aware接口,方便从上下文中获取当前的运行环境,比较常见的几个子接口有:BeanFactoryAware,BeanNameAware,ApplicationContextAware,EnvironmentAware,BeanClassLoaderAware等,这些Aware的作用都可以从命名得知,并且其使用也是十分简单。
2、InitializingBean接口和DisposableBean接口
InitializingBean接口只有一个方法afterPropertiesSet,作用是:当一个Bean实现InitializingBean,afterPropertiesSet方法里面可以添加自定义的初始化方法或者做一些资源初始化操作,当BeanFactory 设置完所有的Bean属性之后才会调用。
DisposableBean接口只有一个方法destroy,作用是:当一个单例Bean实现DisposableBean,destroy可以添加自定义的一些销毁方法或者资源释放操作,单例销毁时由BeanFactory调用destroy。
3、ImportBeanDefinitionRegistrar接口
广大开发者从Spring中开发了很多拓展接口使用方式,ImportBeanDefinitionRegistrar就是其中比较出名的一种,它能够加以利用去达到动态注册bean到spring容器之中的效果。ImportBeanDefinitionRegistrar类只能通过其他类@Import的方式来加载,通常是启动类或配置类。 使用@Import,如果括号中的类是ImportBeanDefinitionRegistrar的实现类,则会调用接口方法,将其中要注册的类注册成bean。 实现该接口的类拥有注册bean的能力。
4、BeanPostProcessor接口和BeanFactoryPostProcessor接口
一般我们叫这两个接口为Spring的Bean后置处理器接口,作用是为Bean的初始化前后提供可扩展的空间。先BeanFactoryPostProcessor 后BeanPostProcessor。可以理解为一个是加强beanFactory一个是加强bean。如果你愿意,你可以配置多个BeanFactoryPostProcessor。你还能通过设置'order'属性来控制BeanFactoryPostProcessor的执行次序
5、BeanDefinitionRegistryPostProcessor 接口
BeanDefinitionRegistryPostProcessor 接口可以看作是BeanFactoryPostProcessor和ImportBeanDefinitionRegistrar的功能集合,既可以获取和修改BeanDefinition的元数据,也可以实现BeanDefinition的注册、移除等操作。
6、FactoryBean接口
首先第一眼要注意,是FactoryBean接口而不是BeanFactory接口。一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean ,实例化bean过程比较复杂。
FactoryBean接口就是为了简化此过程,把bean的实例化定制逻辑下发给使用者。
在该接口中还定义了以下3个方法。
T getObject():返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中。
boolean isSingleton():返回由FactoryBean创建的bean实例的作用域是singleton还是prototype。
Class<T> getObjectType():返回FactoryBean创建的bean类型。
注意一点:通过Spring容器的getBean()方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法所返回的对象,相当于FactoryBean#getObject()代理了getBean()方法。
如果希望获取CarFactoryBean的实例,则需要在使用getBean(beanName) 方法时在beanName前显示的加上 "&" 前缀。
7、ApplicationListener
ApplicationListener是一个接口,里面只有一个onApplicationEvent(E event)方法,这个泛型E必须是ApplicationEvent的子类,而ApplicationEvent是Spring定义的事件,继承于EventObject,构造要求必须传入一个Object类型的source,这个source可以作为一个存储对象。
将会在ApplicationListener的onApplicationEvent里面得到回调。如果在上下文中部署一个实现了ApplicationListener接口的bean,那么每当在一个ApplicationEvent发布到 ApplicationContext时,这个bean得到通知。
其实这就是标准的Oberver设计模式。另外,ApplicationEvent的发布由ApplicationContext通过#publishEvent方法完成。其实这个实现从原理和代码上看都有点像Guava的eventbus。
下面介绍几个常见的用法,其他用法可以再博客的其他位置查看。。。。。。。。
Aware接口族
例如我们经常看到SpringContext工具类:
/**
* Bean工具类
* 在非spring管理的类中获取spring注册的bean
*
* @author xie fei
*/
@Component
public class BeanTool implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
if (applicationContext == null) {
applicationContext = context;
}
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
InitializingBean接口和DisposableBean接口
/**
* @author: xie fei
*/
@Component
public class BeanCreate implements InitializingBean, DisposableBean {
@Override
public void destroy() {
System.out.println("销毁这个bean");
}
@Override
public void afterPropertiesSet() {
System.out.println("初始化这个bean");
}
}