Bean后处理器

常见的Bean后处理器有两种,它主要用来对Bean的注入进行一些拓展解析,比如@Autoweired注解或者@Resource注解。

1.准备Bean

java 复制代码
package com.example.demo2.b02;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/2 23:06
 */
public class Bean1 {
    private static final Logger log = LoggerFactory.getLogger(Bean1.class);
    private Bean2 bean2;
    @Autowired
    public void setBean2(Bean2 bean2){
        log.info("Autowired生效 :{}",bean2);
        this.bean2 = bean2;
    }
    private Bean3 bean3;

    @Resource
    public void setBean3(Bean3 bean3){
        log.info("@Resource生效 :{}",bean3);
        this.bean3 = bean3;
    }
    private String home;
    @Autowired
    public void setHome(@Value("${JAVA_HOME}") String home){
        log.info("@Value生效: {}",home);
    }
    @PostConstruct
    public void init(){
        log.info("@PostConstruct 生效");
    }
    @PreDestroy
    public void destroy(){
        log.info("@PreDestroy 生效");
    }

}
java 复制代码
package com.example.demo2.b02;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/2 23:08
 */
public class Bean2 {
}
java 复制代码
package com.example.demo2.b02;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/2 23:08
 */
public class Bean3 {
}

2.运行主类

java 复制代码
package com.example.demo2.b02;

import org.springframework.context.support.GenericApplicationContext;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/2 23:03
 */
public class TestBeanPostProcessor {
    public static void main(String[] args) {
        //创建一个干净的容器
        GenericApplicationContext context = new GenericApplicationContext();
        //用原始方法注册bean
        context.registerBean("bean1",Bean1.class);
        context.registerBean("bean2",Bean2.class);
        context.registerBean("bean3",Bean3.class);
        //初始化容器
        context.refresh();
        //销毁容器
        context.close();
    }



}

注册我们提供的3个Bean,并且初始化并销毁容器。

结果:

可以发现我们在Bean1中依赖注入的一些类并没有生效。

3.AutowiredAnnotationBeanPostProcessor后处理器

首先需注入下面后处理器。

java 复制代码
context.registerBean(AutowiredAnnotationBeanPostProcessor.class);

结果:

上面已经解析了@Autowired注解,但需对@Value注解进一步处理。

java 复制代码
context.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());

4.CommonAnnotationBeanPostProcessor后处理器

java 复制代码
context.registerBean(CommonAnnotationBeanPostProcessor.class);

结果如下:

该后处理器主要用来解析@Resource注解,还可以解析@PostConstruct,@PreDestroy等注解。而且依赖注入按照一定的排序生效了,从结果来看是@Resource先生效。

相关推荐
Sherry0071 分钟前
从零开始理解 JavaScript Promise:彻底搞懂异步编程
前端·javascript·promise
毛发浓密的女猴子1 分钟前
一次弹窗异常引发的思考:iOS present / push 底层机制全解析
前端
Toomey2 分钟前
一次 npm 更新强制2FA导致的发布失败的排查:403、2FA、Recovery Code、Granular Token 的混乱体验
前端
小满、3 分钟前
Redis:数据结构与基础操作(String、List、Hash、Set、Sorted Set)
java·数据结构·redis·分布式锁
用户4445543654264 分钟前
Android模块化管理
前端
alien爱吃蛋挞6 分钟前
【JavaEE】Spring Boot日志
java·数据库·spring boot
小胖霞8 分钟前
vite+ts+monorepo从0搭建vue3组件库(五):vite打包组件库
前端·vue.js·前端框架
神算大模型APi--天枢64610 分钟前
国产硬件架构算力平台:破解大模型本地化部署难题,标准化端口加速企业 AI 落地
大数据·前端·人工智能·架构·硬件架构
浮游本尊10 分钟前
Java学习第31天 - 高级主题与深度实战
java
BD_Marathon12 分钟前
【JavaWeb】IDEA关联Tomcat并使用Tomcat运行JavaWeb项目
java·tomcat·intellij-idea