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

相关推荐
较劲男子汉21 分钟前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
老毛肚22 分钟前
MyBatis体系结构与工作原理 上篇
java·mybatis
wypywyp33 分钟前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
风流倜傥唐伯虎1 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Doro再努力1 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene1 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
不像程序员的程序媛1 小时前
Nginx日志切分
服务器·前端·nginx
Yvonne爱编码1 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚1 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
忧郁的橙子.1 小时前
02-本地部署Ollama、Python
linux·运维·服务器