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

相关推荐
子兮曰9 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!9 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰9 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里9 小时前
java中的继承和多态的区别
java
小羊没烦恼!9 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万9 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝9 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕9 小时前
JSONObject与JSONArray封装数据格式区别
java·json
虎头金猫10 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码10 小时前
别再前后端各写一套表单校验了
java·后端