【SpringBoot_ANNOTATIONS】自动装配 04 Aware 注入Spring底层组件 & 原理

本文介绍了Spring框架中的Aware接口及其相关实现,如ApplicationContextAware、BeanNameAware和EmbeddedValueResolverAware。通过这些接口,自定义组件可以在初始化时获取Spring容器中的ApplicationContext和其他重要组件,以便于进行依赖注入和资源访问。在测试示例中,展示了如何在组件中使用这些接口并观察其注入过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动装配 04 Aware 注入Spring底层组件 & 原理

总接口:Aware

  1. 自定义组件想要使用Spring容器底层的一些组件(ApplicationContext BeanFactory 等等)
  2. 需要让自定义组件实现xxAware接口:在创建对象的时候会调用接口规定的方法注入相关组件 总体参照 Aware 接口 ,把Spring底层一些组件注入到自定义的bean中
  3. xxxAware功能:使用xxProcessor 如ApplicationContextAware ==》 ApplicationContextAwareProcessor,利用后置处理器判断实现了哪个接口,就将Bean转成相应的接口类型,再选择注入相应类型的applicationContext
/**
 * 生命周期 感知接口测试
 */
@Component//注入后自动调用实现的感知接口方法
public class Red implements ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware {
    private ApplicationContext applicationContext;
    @Override
    public void setBeanName(String name) {
        System.out.println("调用了 setBeanName");
        System.out.println("当前bean的名字 " + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
        System.out.println("调用了 setApplicationContext");
    }

    /**
     * 解析占位符
     * @param resolver
     */
    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        System.out.println("调用了 setEmbeddedValueResolver");
        String resolveString = resolver.resolveStringValue(" hello ${os.name} ; age #{22-1}");
        System.out.println("解析的字符串 " + resolveString);
    }
}

配置类

@Configuration
@ComponentScan(value = {"com.example.annotations.service","com.example.annotations.dao","com.example.annotations.controller","com.example.annotations.bean"})
public class MainConfig4Autowire {

}

测试

    @Test
    void autowiredTest(){
        //配置类测试
        System.out.println("准备创建容器");
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig4Autowire.class);
        System.out.println("容器创建完毕");
        
        //关闭容器
        applicationContext.close();
        System.out.println("容器已关闭");
    }

测试结果:
在这里插入图片描述

<think>嗯,用户让我介绍一下Spring Boot 3的自动装配原理,我需要用中文回答。首先,我得回忆一下自己了解的Spring Boot自动配置机制,确保信息准确。记得Spring Boot的核心是自动配置,通过@EnableAutoConfiguration和spring.factories文件来实现的。不过Spring Boot 3可能有些变化,比如是否还使用spring.factories,或者改用了其他方式? 对了,Spring Boot 2.7开始引入了新的自动配置加载机制,可能用META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports代替了原来的spring.factories,而Spring Boot 3应该已经完全转向这种新方式了。需要确认这一点,避免给用户过时的信息。 用户可能是开发者,想要了解原理来优化自己的项目或者解决相关问题。可能需要分步骤解释,从启动类开始,到@SpringBootApplication的组合注解,特别是@EnableAutoConfiguration的作用。然后说明自动配置类是如何被加载的,条件注解如@ConditionalOnClass的作用,以及如何通过配置属性控制自动装配。 还要注意提到Spring Boot 3的新特性,比如对Jakarta EE的支持,可能影响自动配置中的条件判断。需要举一个例子,比如DataSource的自动配置,当类路径下有HikariCP时才会生效,这样用户更容易理解。 另外,用户可能想知道如何自定义自动配置,或者排除某些自动配置,所以可以提到@EnableAutoConfiguration的exclude属性,或者配置文件中的exclude配置。总结部分要简明扼要,强调自动装配带来的便利和背后的机制。 要确保语言通俗易懂,避免过于技术化的术语,但也要准确。可能需要检查是否有最新的变化,比如是否还有其他的条件注解,或者Spring Boot 3中的其他改进。总之,结构要清晰,先讲原理,再讲实现,最后举例说明,这样用户能逐步理解。Spring</think> Boot 3 的自动装配(Auto-Configuration)是其核心特性之一,它通过约定大于配置的方式简化了应用的初始化流程。以下是其原理的核心要点和实现逻辑: --- ### **1. 核心注解:@SpringBootApplication** 启动类上的 `@SpringBootApplication` 是一个组合注解,包含: - `@SpringBootConfiguration`:标记当前类是配置类。 - `@ComponentScan`:扫描当前包及子包下的组件(如 `@Component`, `@Service` 等)。 - **`@EnableAutoConfiguration`**:触发自动装配的关键。 --- ### **2. 自动装配触发机制** `@EnableAutoConfiguration` 通过以下步骤加载配置: 1. **加载 `AutoConfiguration` 列表** Spring Boot 3 使用 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 文件(取代旧版的 `spring.factories`),列出所有自动配置类的全限定名。 2. **按需筛选** 通过条件化注解(如 `@ConditionalOnClass`, `@ConditionalOnMissingBean`)判断是否生效。例如: ```java @Configuration @ConditionalOnClass(DataSource.class) // 当类路径存在 DataSource 时生效 public class DataSourceAutoConfiguration { ... } ``` --- ### **3. 条件化注解(Conditional Annotations)** Spring Boot 通过条件注解动态决定是否装配 Bean,常用注解包括: - `@ConditionalOnClass`:类路径存在指定类时生效。 - `@ConditionalOnMissingBean`:容器中不存在指定 Bean 时生效。 - `@ConditionalOnProperty`:配置文件中指定属性为特定值时生效。 - `@ConditionalOnWebApplication`:当前是 Web 应用时生效。 --- ### **4. 自动装配的实现流程** 1. **启动应用**:通过 `SpringApplication.run()` 初始化上下文。 2. **加载配置**:读取 `AutoConfiguration.imports` 中的所有自动配置类。 3. **条件过滤**:根据当前环境(如依赖、配置、已有 Bean)过滤出有效的配置类。 4. **注册 Bean**:将符合条件的配置类中的 Bean 注册到 Spring 容器。 --- ### **5. 自定义自动装配** 若需扩展自动装配,可以: 1. 创建自定义配置类,添加 `@Configuration`。 2. 在 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 中注册该类。 3. 使用条件注解控制生效逻辑。 --- ### **6. 示例:DataSource 自动装配** 当引入 `spring-boot-starter-jdbc` 依赖时: 1. 类路径下存在 `DataSource` 和 `HikariCP`。 2. `DataSourceAutoConfiguration` 生效,自动创建 `DataSource` Bean。 3. 若未手动配置 `DataSource`,则使用默认的 `HikariCP` 连接池。 --- ### **7. Spring Boot 3 的改进** - **迁移到 Jakarta EE**:包名从 `javax` 改为 `jakarta`,影响条件注解的判断。 - **GraalVM 原生镜像支持**:优化了自动装配的条件加载机制,减少反射和动态代理的使用。 - **更严格的模块化**:自动配置类的加载逻辑更清晰。 --- ### **总结** Spring Boot 3 的自动装配通过 **条件化加载** + **约定优于配置**,大幅减少了样板代码。开发者只需关注业务逻辑,而无需手动配置大量 Bean,同时能通过条件注解灵活控制组件的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值