代码编织梦想

1. 前言

BeanPostProcessor 后置处理器可用于 bean 初始化前后进行逻辑增强。Spring 提供了 BeanPostProcessor 接口的很多实现类,例如 AutowiredAnnotationBeanPostProcessor 用于 @Autowired 注解的实现,AnnotationAwareAspectJAutoProxyCreator 用于 Spring AOP 的动态代理等等

它有力的支撑了 Spring AOP 的实现,所以了解学习 BeanPostProcessor 接口非常有必要

2. BeanPostProcessor 接口

2.1. 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() 这两个方法分别是在 Spring 容器中的 bean 初始化前后执行; Spring 容器中的每一个 bean 对象初始化前后,都会执行 BeanPostProcessor 接口的实现类中的这两个方法
  • 也就是说 postProcessBeforeInitialization() 方法会在 bean 实例化和属性填充完成之后,自定义初始化方法之前被调用,而 postProcessAfterInitialization() 方法会在自定义初始化方法之后被调用
  • 当容器中存在多个 BeanPostProcessor 的实现类时,会按照它们在容器中注册的顺序执行

2.2. 自定义 BeanPostProcessor 后置处理器

2.2.1. 实现 BeanPostProcessor 接口

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException {
        System.out.println("执行了postProcessBeforeInitialization方法......" + beanName + "=>" + bean);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException {
        System.out.println("执行了postProcessAfterInitialization方法......" + beanName + "=>" + bean);
        return bean;
    }
}

2.2.2. 创建实体类

@Component
public class Cat implements InitializingBean, DisposableBean {

    public Cat() {
        System.out.println("执行了Cat的无参构造器............");
    }

    // 实现DisposableBean接口的方法,会在容器关闭的时候进行调用
    @Override
    public void destroy() throws Exception {
        System.out.println("执行了Cat的destroy方法............");
    }

    public void destroyOne() throws Exception {
        System.out.println("执行了Cat的destroyOne方法............");
    }

    // 实现InitializingBean接口的方法,会在bean创建完成,并且属性都赋好值以后进行调用
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("执行了Cat的afterPropertiesSet方法............");
    }

    public void init() throws Exception {
        System.out.println("执行了Cat的init方法............");
    }
}

2.2.3. 创建配置类

@Configuration
public class IOCLifeCycleConfigOne {

    @Bean(initMethod = "init", destroyMethod = "destroyOne")
    public Cat cat() {
        return new Cat();
    }
}

2.2.4. 测试结果

@SpringBootTest
@RunWith(value = SpringRunner.class)
public class IOCLifeCycleOneTest {

    @Test
    public void test02() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(IOCLifeCycleConfigOne.class);
        Cat cat = (Cat) applicationContext.getBean("cat");
        System.out.println(cat);

        // 关闭容器
        applicationContext.close();
    }
}

test02() 方法测试结果

在这里插入图片描述
自定义后置处理器测试结果

在这里插入图片描述

  • 首先执行无参构造器
  • 由于Cat 类没有属性,所以没有属性填充的日志。故而接下来在初始化方法之前调用了我们自己实现的 postProcessBeforeInitialization() 方法
  • 此时没有 @PostConstruct 注解来指定初始化之前的方法,所以接下来执行实现了 InitializingBean 接口的 afterPropertiesSet() 的自定义初始化方法
  • 再下来就会执行 @Bean 注解所指定的自定义初始化方法
  • 不用多想,初始化方法已完成执行了,再执行 postProcessAfterInitialization() 方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38192427/article/details/127158394

spring后置处理器之-beanpostprocessor_林海静的博客-爱代码爱编程

在bean初始化前后进行一些处理工作; BeanPostProcessor【interface】:bean的后置处理器;                方法postProcessBeforeInitialization():在初始化之前工作                方法postProcessAfterInitialization():在初始化之后工

【spring注解系列11】spring后置处理器beanpostprocessor用法与原理_java仗剑走天涯的博客-爱代码爱编程_后置处理器

1.BeanPostProcessor原理 先说,bean的后置处理器BeanPostProcessor接口中两个方法: postProcessBeforeInitialization:在初始化之前工作postProcessAfterInitialization:在初始化之后工作   BeanPostProcessor原理 populateBean

spring注解驱动开发 第十节bean的后置处理器_请叫我路由器的博客-爱代码爱编程

Spring注解驱动开发 第十节Bean的后置处理器 首先要提到的是Bean的后置处理器与之前的初始化方法与销毁方法有什么区别呢,其实后置处理器的粒度要比初始化方法小,因为后置处理器是在bean初始化方法调用的前后做相关操

spring beanpostprocessor 后置处理器学习_tom有了cat的博客-爱代码爱编程

基础概念: 1、实例化—-实例化的过程是一个创建Bean的过程,即调用Bean的构造函数,单例的Bean放入单例池中 2、初始化—-初始化的过程是一个赋值的过程,即调用Bean的setter,设置Bean的属性 sprig  beanPostProcessor 后置处理器主要用于对在对象初始化之前或者在对象初始化之后在这期间可以对对象做一些其他事情,

spring注解---BeanPostProcessor后置处理器-爱代码爱编程

.BeanPostProcessor :bean的后置处理器。         postProcessBeforeInitialization:bean实例被创建之后,初始化方法执行之前被执行         postProcessAfterInitialization:初始化方法执行之后被执行         参数:Object bean:当前实例

Spring注解09——BeanPostProcessor后置处理器深度剖析-爱代码爱编程

该系列文章主要学习 雷丰阳老师的《Spring注解驱动》课程总结。 原课程地址:课程地址 包括了自己阅读其他书籍《Spring揭秘》《Spring Boot 实战》等课程。 该系列文档会不断的完善,欢迎大家留言及提意见。 文章目录 1. 写在之前2. BeanPostProcessor 是什么3. xxxBeanPostProc

攀登Spring珠穆朗玛峰:前置与后置处理器-爱代码爱编程

文章目录 Spring的前置与后置处理器前提知识前置与后置处理器定义前置处理器:BeanFactoryPostProcessor`postProcessBeanFactory`调用后置处理器:BeanPostProcessor1、InstantiationAwareBeanPostProcessor`postProcessBeforeInstant

Spring-后置处理器BeanPostProcessor的简单使用和介绍-爱代码爱编程

BeanPostProcessor官方定义为工厂钩子,我们也俗称后置处理器。它允许自定义修改新的bean实例,例如检查标记接口或用代理包装它们。应用程序上下文可以在其bean定义中自动检测BeanPostProcessor bean,并将它们应用于随后创建的任何bean。 简单使用 BeanPostProcessor类 public int

BeanPostProcessor后置处理器-爱代码爱编程

后置处理 Bean : BeanPostProcessor的使用 在bean对象初始化之前和之后 (bean从容器中返回给我们之前): 来做某些事情 BeanPostProcessor 作用:对 Spring 工厂所创建的对象,进行再加工。(AOP 的底层实现)后置处理 Bean 原理分析程序员实现 BeanPostProcessor 接口中

[手写spring](4)实现后置处理器_秃头披风侠.的博客-爱代码爱编程

目录 目标 自定义注解 自定义接口 执行bean的初始化方法 创建后置处理器名称Set 初始化后置处理器名称集合 执行后置处理器方法 执行所有postProcessBeforeInitialization方法 执行所有postProcessAfterInitialization方法 调用初始化方法、后置处理器方法 测试 总结 目标

spring之beanfactorypostprocessor(bean工厂后置处理器)_冬天vs不冷的博客-爱代码爱编程

文章目录 1、BeanFactoryPostProcessor的执行时机和作用1.1、BeanFactoryPostProcessor-bean工厂定义后置处理器1.2、BeanDefinitionRegistryP

spring注解驱动之beanpostprocessor后置处理器详解_融极的博客-爱代码爱编程

概述 在学习Spring的时候,在了解基本用法的时候,如果有时间一定要深入源码了解Spring的底层原理,这样在做一些适配工作、写一些轮子的时候就会比较容易,否则会很难,甚至一头雾水,无法完成工作。 吃透Spring的原理