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先生效。

相关推荐
惜茶22 分钟前
vue+SpringBoot(前后端交互)
java·vue.js·spring boot
杰克尼1 小时前
springCloud_day07(MQ高级)
java·spring·spring cloud
小陈工1 小时前
2026年4月2日技术资讯洞察:数据库融合革命、端侧AI突破与脑机接口产业化
开发语言·前端·数据库·人工智能·python·安全
Arvin6272 小时前
Nginx 添加账号密码访问验证
运维·服务器·nginx
IT_陈寒2 小时前
Vue的这个响应式问题,坑了我整整两小时
前端·人工智能·后端
C澒2 小时前
AI 生码:A 类生码方案架构升级
前端·ai编程
前端Hardy2 小时前
前端必看!LocalStorage这么用,再也不踩坑(多框架通用,直接复制)
前端·javascript·面试
前端Hardy2 小时前
前端必看!前端路由守卫这么写,再也不担心权限混乱(Vue/React通用)
前端·javascript·面试
NHuan^_^2 小时前
SpringBoot3 整合 SpringAI 实现ai助手(记忆)
java·人工智能·spring boot
Lee川3 小时前
从零构建现代化登录界面:React + Tailwind CSS 前端工程实践
前端·react.js