spring的扩展接口

spring的扩展接口

spring提供了一些扩展接口来对spring进行定制化功能,可以选择如下一些扩展点:

BeanFactoryPostProcessor

beanFactory后置处理器,存在于容器启动阶段,支持在bean factory标准初始化完成后,对bean factory进行一些额外处理。这时所有的BeanDefinition已经加载完毕,但是还没有进行bean初始化此时可以对bean的定义元信息(BeanDefinition)进行修改,但是不能对bean的实例进行修改,如PropertyPlaceholderConfigurer,就是在这个扩展点上对bean属性中的占位符进行替换

java 复制代码
public interface BeanFactoryPostProcessor {

   
   void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

BeanDefinitionRegistryPostProcessor

它扩展自BeanFactoryPostProcessor,在执行BeanFactoryPostProcessor的功能前,提供了可以添加bean definition的能力,允许在初始化一般bean前,注册额外的bean。例如可以在这里根据bean的scope创建一个新的代理bean

java 复制代码
public class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        registry.registerBeanDefinition("newAdd", BeanDefinitionBuilder.genericBeanDefinition(UserServiceBiz.class).getBeanDefinition());
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }
}

BeanPostProcessor

提供了在bean初始化之前和之后插入自定义逻辑的能力。与BeanFactoryPostProcessor的区别是处理的对象不同,BeanFactoryPostProcessor是对beanfactory进行处理,BeanPostProcessor是对bean的实例进行处理存在于bean对象实例化阶段。如BeanNameAutoProxyCreator来为对象生成相应的代理对象

注:上面这三个扩展点,可以通过实现Ordered和PriorityOrdered接口来指定执行顺序。实现PriorityOrdered接口的processor会先于实现Ordered接口的执行。

java 复制代码
public interface BeanPostProcessor {

   // 初始化bean之前
   Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

   // 初始化bean之后
   Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

}

InstantiationAwareBeanPostProcessor

继承自BeanPostProcessor,在其基础上增加了三个方法,把可扩展的范围增加了实例化阶段和属性注入阶段

java 复制代码
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

   // 实例化bean之前
   Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

   // 实例化bean之后
   boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

   // bean已经实例完成,在属性注入时触发  @Autowired、@Resource都是这种方式实现的(AutowiredAnnotationBeanPostProcessor、)
   PropertyValues postProcessPropertyValues(
         PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;

}

Aware接口

Aware接口的目的是为了让Bean获得Spring容器中的服务

BeanFactoryAware

如果对象实例实现了BeanFactoryAware接口,BeanFactory容器会将自身通过调用setBeanFactory方法传递给该对象实例,使得该对象实例拥有了BeanFactory的实例引用,用于获取当前BeanFactory

java 复制代码
public interface BeanFactoryAware extends Aware {

   void setBeanFactory(BeanFactory beanFactory) throws BeansException;

}

ApplicationContextAware

可以获得ApplicationContext及其中的bean,当需要在代码中动态获取bean时,可以通过实现这个接口来实现,用于获取ApplicationContext

java 复制代码
public interface ApplicationContextAware extends Aware {

   
   void setApplicationContext(ApplicationContext applicationContext) throws BeansException;

}

BeanNameAware

如果spring容器检测到当前对象实现了BeanNameAware接口,会将该对象实例的bean定义对应的beanName调用setBeanName方法传递给当前对象实例,用于获取容器中bean的名称

java 复制代码
public interface BeanNameAware extends Aware {
   void setBeanName(String name);

}

BeanClassLoaderAware

获取类加载器

java 复制代码
public interface BeanClassLoaderAware extends Aware {

   void setBeanClassLoader(ClassLoader classLoader);

}

MessageSourceAware

用于获取MessageSource

java 复制代码
public interface MessageSourceAware extends Aware {

  
   void setMessageSource(MessageSource messageSource);

}

EnvironmentAware

获取环境变量

java 复制代码
public interface EnvironmentAware extends Aware {

   
   void setEnvironment(Environment environment);

}

EmbeddedValueResolverAware

获取spring容器加载的properties文件属性值

java 复制代码
public interface EmbeddedValueResolverAware extends Aware {

  
   void setEmbeddedValueResolver(StringValueResolver resolver);

}

ApplicationEventPublisherAware

应用事件发布器,可以发布事件

java 复制代码
public interface ApplicationEventPublisherAware extends Aware {

   
   void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher);

}

ResourceLoaderAware

获得资源加载器,可以获得外部资源文件

java 复制代码
public interface ResourceLoaderAware extends Aware {

   
   void setResourceLoader(ResourceLoader resourceLoader);

}

InitializingBean

可以在bean初始化完成,所有属性设置完成后执行特定逻辑,例如对自动装配对属性进行验证等等

java 复制代码
public interface InitializingBean {

   void afterPropertiesSet() throws Exception;

}

DisposableBean

用于在bean被销毁前执行特定的逻辑,例如做一些回收工作等

java 复制代码
public interface DisposableBean {

   void destroy() throws Exception;

}

ApplicationListener

用来监听spring的标准应用事件或者自定义事件

java 复制代码
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
   void onApplicationEvent(E event);

}

zhhll.icu/2021/框架/spr...

本文由mdnice多平台发布

相关推荐
huohaiyu35 分钟前
Hashtable,HashMap,ConcurrentHashMap之间的区别
java·开发语言·多线程·哈希
信奥卷王2 小时前
[GESP202503 五级] 原根判断
java·数据结构·算法
小咕聊编程2 小时前
【含文档+源码】基于SpringBoot的过滤协同算法之网上服装商城设计与实现
java·spring boot·后端
Zz_waiting.2 小时前
Spring 原理
java·spring·spring自动管理
瓯雅爱分享6 小时前
Java+Vue构建的采购招投标一体化管理系统,集成招标计划、投标审核、在线竞价、中标公示及合同跟踪功能,附完整源码,助力企业实现采购全流程自动化与规范化
java·mysql·vue·软件工程·源代码管理
mit6.8248 小时前
[C# starter-kit] 命令/查询职责分离CQRS | MediatR |
java·数据库·c#
诸神缄默不语8 小时前
Maven用户设置文件(settings.xml)配置指南
xml·java·maven
任子菲阳9 小时前
学Java第三十四天-----抽象类和抽象方法
java·开发语言
学Linux的语莫9 小时前
机器学习数据处理
java·算法·机器学习
找不到、了9 小时前
JVM的即时编译JIT的介绍
java·jvm