Java BeanPostProcessor与BeanFactoryPostProcessor基础使用讲解

作者:氵奄不死的鱼 时间:2022-10-25 21:52:35 

前言

BeanPostProcessor 接口定义了一个你可以自己实现的回调方法,来实现你自己的实例化逻辑、依赖解决逻辑等,如果你想要在Spring完成对象实例化、配置、初始化之后实现自己的业务逻辑,你可以补充实现一个或多个BeanPostProcessor的实现。

BeanFactoryPostProcessor的定义和BeanPostProcessor相似,有一个最主要的不同是:BeanFactoryPostProcessor可以对bean的配置信息进行操作;更确切的说Spring IOC容器允许BeanFactoryPostProcessor读取配置信息并且能够在容器实例化任何其他bean(所有的实现了BeanFactoryPostProcessor接口的类)之前改变配置信息

BeanPostProcessor

接口定义

public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}

postProcessBeforeInitialization和postProcessAfterInitialization

入参是 bean示例和beanName,此方法内可以对bean进行处理并且返回一个对象,更改bean实例,例如代理,修改对象数据

执行时机

执行时机参考

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)

if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}

即整个bean已经加载完毕,依赖的bean已经注入完毕,分别在,执行初始化方法前和方法后执行

初始化方法指的是执行InitializingBean的afterPropertiesSet方法

初始化方法指的是bean实现了InitializingBean接口,对应的方法为afterPropertiesSet

BeanFactoryPostProcessor

接口定义

FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

入参就是beanFactory,可以对beanFactory进行修改

例如通过beanFactory修改beanDefination,添加属性

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
   public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
       System.out.println("调用MyBeanFactoryPostProcessor的postProcessBeanFactory");
       BeanDefinition bd = beanFactory.getBeanDefinition("myJavaBean");
       MutablePropertyValues pv =  bd.getPropertyValues();  
       if (pv.contains("remark")) {  
           pv.addPropertyValue("remark", "在BeanFactoryPostProcessor中修改之后的备忘信息");  
       }  
   }
}

执行时机

在bean实例化之前执行,在invokeBeanFactoryPostProcessors中。

来源:https://blog.csdn.net/qq_37436172/article/details/127834066

标签:Java,BeanPostProcessor,BeanFactoryPostProcessor
0
投稿

猜你喜欢

  • Java基础之String类使用与字符串比较

    2023-11-09 23:46:51
  • Android编程设计模式之原型模式实例详解

    2021-09-14 02:20:47
  • Quartz与Spring集成的两种方法示例

    2022-05-22 05:15:41
  • 简单说说Java SE、Java EE、Java ME三者之间的区别

    2022-01-20 06:05:10
  • C++智能指针实例详解

    2021-12-18 00:38:59
  • Spring Boot 集成Dubbo框架实例

    2022-02-03 21:23:27
  • Java使用Math.random()结合蒙特卡洛方法计算pi值示例

    2023-05-10 10:43:13
  • Android带进度的圆形进度条

    2023-08-05 21:47:18
  • 谈一谈Android内存泄漏问题

    2023-01-29 23:23:54
  • idea首次使用需要配置哪些东西

    2022-05-16 20:01:37
  • Android图像处理之霓虹滤镜效果

    2023-08-11 14:37:41
  • Java Hutool工具实现验证码生成及Excel文件的导入和导出

    2023-02-04 22:49:32
  • 非常实用的侧滑删除控件SwipeLayout

    2023-02-01 14:52:39
  • Android 文件存储及常见问题解决

    2023-07-12 13:25:45
  • Springboot内置的工具类之CollectionUtils示例讲解

    2023-08-23 20:47:13
  • 使用RecyclerView实现水平列表

    2022-04-25 19:27:13
  • Android自定义有限制区域图例角度自识别涂鸦工具类中篇

    2021-06-16 16:21:46
  • C# 反射与 Quartz 实现流程处理详情

    2022-11-11 09:11:07
  • Android 实现定时器的四种方式总结及实现实例

    2023-04-20 15:22:04
  • 浅谈redis key值内存消耗以及性能影响

    2022-11-09 20:35:17
  • asp之家 软件编程 m.aspxhome.com