springframework的钩子方法和钩子接口的介绍

前言

SpringFramework其实具有很高的扩展性,只是很少人喜欢挖掘那些扩展点,而且官方的Refrence也很少提到那些Hook类或Hook接口

1、Aware接口族

Spring中提供了各种Aware接口,方便从上下文中获取当前的运行环境,比较常见的几个子接口有:BeanFactoryAware,BeanNameAware,ApplicationContextAware,EnvironmentAwareBeanClassLoaderAware等,这些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");
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值