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

相关推荐
雀啼春7 分钟前
Java中的数据类型
java
CHANG_THE_WORLD9 分钟前
PDF文档结构分析 一
前端·pdf
80530单词突击赢16 分钟前
C++关联容器深度解析:set/map全攻略
java·数据结构·算法
兩尛22 分钟前
c++知识点1
java·开发语言·c++
东东51625 分钟前
果园预售系统的设计与实现spingboot+vue
前端·javascript·vue.js·spring boot·个人开发
舟舟亢亢25 分钟前
JVM复习笔记——下
java·jvm·笔记
rainbow688926 分钟前
Python学生管理系统:JSON持久化实战
java·前端·python
打小就很皮...30 分钟前
React Router 7 全局路由保护
前端·react.js·router
我送炭你添花38 分钟前
开源TR-069 ACS(自动配置服务器)GenieACS 的四个主要模块详细介绍
运维·服务器·开源