常见Bean后处理器

在bean生命周期过程中,用于增强(扩展功能)的对象;
也是一种Bean,在Spring容器中。

  1. 用来解析:@Autowired @Value的处理器。
  2. 用来解析:@Resource @PostConstruct的处理器。
  3. 用来解析:配置的处理器。

代码举例

package com.example.demo.springTest.a04;


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

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

@Slf4j
public class Bean01 {
    // public Bean01(String home){
    //     log.info("bean01 构造函数执行了");
    //     this.home=home;
    // }

    public Bean01(){
        log.info("bean01 无参构造函数执行了");
    }

    private Bean02 bean02;

    @Autowired
    public void setBean02(Bean02 bean02){
        log.info("@Autowired 生效:{}",bean02);
        this.bean02=bean02;
    }

    private Bean03 bean03;
    @Resource
    public void setBean03(Bean03 bean03){
        log.info("@Resource 生效: {}",bean03);
        this.bean03=bean03;
    }

    private String home;
    @Autowired
    public void setHome(@Value("${JAVA_HOME}") String home){
        log.info("@Value 生效:{}",home);
        this.home=home;
    }

    @PostConstruct
    public void init(){
        log.info("@PostConstruct 生效");
    }

    @Override
    public String toString() {
        return "Bean01{" +
                "bean02=" + bean02 +
                ", bean03=" + bean03 +
                ", home='" + home + '\'' +
                '}';
    }
}

package com.example.demo.springTest.a04;

public class Bean02 {
}

package com.example.demo.springTest.a04;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
import org.springframework.context.support.GenericApplicationContext;

/**
 * bean后处理器的作用:解析@Autowired注解,完成注入。
 */
@Slf4j
public class Application04 {
    public static void main(String[] args) {
        // 创建ApplicationContext
        GenericApplicationContext context = new GenericApplicationContext();

        // 在ApplicationContext中注册Class为bean
        context.registerBean("bean01",Bean01.class);
        context.registerBean("bean02",Bean02.class);
        context.registerBean("bean03",Bean03.class);

        // refresh()创建单例
        log.info("===================context.refresh()   begin");
        // context.refresh();
        // Object bean01 = context.getBean("bean01");
        // log.info("01--只创建未注入的bean01: "+bean01.toString());

        log.info("===================context.refresh()   增加AutowiredAnnotationBeanPostProcessor后 begin");
        context.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
        context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
        context.registerBean(CommonAnnotationBeanPostProcessor.class);
        context.refresh();
        Object bean01 = context.getBean("bean01");
        log.info("01--只创建未注入的bean01: "+bean01.toString());

    }
}

C:\Java\jdk1.8.0_341\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2022.1.4\lib\idea_rt.jar=62173:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2022.1.4\bin" -Dfile.encoding=UTF-8 -classpath C:\Java\jdk1.8.0_341\jre\lib\charsets.jar;C:\Java\jdk1.8.0_341\jre\lib\deploy.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\access-bridge-64.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\cldrdata.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\dnsns.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\jaccess.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\jfxrt.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\localedata.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\nashorn.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\sunec.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\sunjce_provider.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\sunmscapi.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\sunpkcs11.jar;C:\Java\jdk1.8.0_341\jre\lib\ext\zipfs.jar;C:\Java\jdk1.8.0_341\jre\lib\javaws.jar;C:\Java\jdk1.8.0_341\jre\lib\jce.jar;C:\Java\jdk1.8.0_341\jre\lib\jfr.jar;C:\Java\jdk1.8.0_341\jre\lib\jfxswt.jar;C:\Java\jdk1.8.0_341\jre\lib\jsse.jar;C:\Java\jdk1.8.0_341\jre\lib\management-agent.jar;C:\Java\jdk1.8.0_341\jre\lib\plugin.jar;C:\Java\jdk1.8.0_341\jre\lib\resources.jar;C:\Java\jdk1.8.0_341\jre\lib\rt.jar;D:\20--Dev\Projects\demo\target\classes;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot-starter\2.7.3\spring-boot-starter-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot\2.7.3\spring-boot-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-context\5.3.22\spring-context-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot-autoconfigure\2.7.3\spring-boot-autoconfigure-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot-starter-logging\2.7.3\spring-boot-starter-logging-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-core\5.3.22\spring-core-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-jcl\5.3.22\spring-jcl-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot-starter-web\2.7.3\spring-boot-starter-web-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot-starter-json\2.7.3\spring-boot-starter-json-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\fasterxml\jackson\core\jackson-databind\2.13.3\jackson-databind-2.13.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\fasterxml\jackson\core\jackson-annotations\2.13.3\jackson-annotations-2.13.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\fasterxml\jackson\core\jackson-core\2.13.3\jackson-core-2.13.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.3\jackson-datatype-jdk8-2.13.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.3\jackson-datatype-jsr310-2.13.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.3\jackson-module-parameter-names-2.13.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot-starter-tomcat\2.7.3\spring-boot-starter-tomcat-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\apache\tomcat\embed\tomcat-embed-core\9.0.65\tomcat-embed-core-9.0.65.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\apache\tomcat\embed\tomcat-embed-el\9.0.65\tomcat-embed-el-9.0.65.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.65\tomcat-embed-websocket-9.0.65.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-web\5.3.22\spring-web-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-beans\5.3.22\spring-beans-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-webmvc\5.3.22\spring-webmvc-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-aop\5.3.22\spring-aop-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-expression\5.3.22\spring-expression-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\projectlombok\lombok\1.16.10\lombok-1.16.10.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\oracle\ojdbc6\6.0\ojdbc6-6.0.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\baomidou\mybatis-plus-boot-starter\3.5.2\mybatis-plus-boot-starter-3.5.2.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\baomidou\mybatis-plus\3.5.2\mybatis-plus-3.5.2.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\baomidou\mybatis-plus-extension\3.5.2\mybatis-plus-extension-3.5.2.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\baomidou\mybatis-plus-core\3.5.2\mybatis-plus-core-3.5.2.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\baomidou\mybatis-plus-annotation\3.5.2\mybatis-plus-annotation-3.5.2.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\github\jsqlparser\jsqlparser\4.4\jsqlparser-4.4.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\mybatis\mybatis\3.5.10\mybatis-3.5.10.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\mybatis\mybatis-spring\2.0.7\mybatis-spring-2.0.7.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\jetbrains\kotlin\kotlin-stdlib-jdk8\1.6.21\kotlin-stdlib-jdk8-1.6.21.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\jetbrains\kotlin\kotlin-stdlib\1.6.21\kotlin-stdlib-1.6.21.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\jetbrains\kotlin\kotlin-stdlib-common\1.6.21\kotlin-stdlib-common-1.6.21.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\jetbrains\annotations\13.0\annotations-13.0.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\jetbrains\kotlin\kotlin-stdlib-jdk7\1.6.21\kotlin-stdlib-jdk7-1.6.21.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot-starter-jdbc\2.7.3\spring-boot-starter-jdbc-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-jdbc\5.3.22\spring-jdbc-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\spring-tx\5.3.22\spring-tx-5.3.22.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\com\baomidou\dynamic-datasource-spring-boot-starter\3.5.2\dynamic-datasource-spring-boot-starter-3.5.2.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\springframework\boot\spring-boot-starter-aop\2.7.3\spring-boot-starter-aop-2.7.3.jar;D:\20--Dev\apache-maven-3.8.6\local_repo\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar com.example.demo.springTest.a04.Application04
00:11:14.551 [main] INFO com.example.demo.springTest.a04.Application04 - ===================context.refresh()   begin
00:11:14.551 [main] INFO com.example.demo.springTest.a04.Application04 - ===================context.refresh()   增加AutowiredAnnotationBeanPostProcessor后 begin
00:11:14.571 [main] DEBUG org.springframework.context.support.GenericApplicationContext - Refreshing org.springframework.context.support.GenericApplicationContext@16b3fc9e
00:11:14.583 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor'
00:11:14.611 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.CommonAnnotationBeanPostProcessor'
00:11:14.620 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'bean01'
00:11:14.636 [main] INFO com.example.demo.springTest.a04.Bean01 - bean01 无参构造函数执行了
00:11:14.670 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'bean03'
00:11:14.670 [main] INFO com.example.demo.springTest.a04.Bean01 - @Resource 生效: com.example.demo.springTest.a04.Bean03@757942a1
00:11:14.678 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'JAVA_HOME' in PropertySource 'systemEnvironment' with value of type String
00:11:14.678 [main] INFO com.example.demo.springTest.a04.Bean01 - @Value 生效:C:\Java\jdk1.8.0_341
00:11:14.678 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'bean02'
00:11:14.678 [main] INFO com.example.demo.springTest.a04.Bean01 - @Autowired 生效:com.example.demo.springTest.a04.Bean02@548ad73b
00:11:14.678 [main] INFO com.example.demo.springTest.a04.Bean01 - @PostConstruct 生效
00:11:14.678 [main] INFO com.example.demo.springTest.a04.Application04 - 01--只创建未注入的bean01: Bean01{bean02=com.example.demo.springTest.a04.Bean02@548ad73b, bean03=com.example.demo.springTest.a04.Bean03@757942a1, home='C:\Java\jdk1.8.0_341'}

Process finished with exit code 0

总结

  1. context.refresh():是创建bean实例,单纯的创建bean实例,没有注入,成员变量都是空。
  2. 注册了AutowiredAnnotationBeanPostProcessor后,实现了@Autowired @Value的解析和注入。
  3. 注册了CommonAnnotationBeanPostProcessor后,实现了@Resource @PostConstruct解析。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值