Spring Boot 自动配置 : AopAutoConfiguration

本文深入探讨了Spring Boot中AopAutoConfiguration类的作用,详细分析了其如何根据配置参数spring.aop.auto和spring.aop.proxy-target-class决定使用@EnableAspectJAutoProxy注解的方式,以及如何在不同条件下启用JdkDynamicAutoProxyConfiguration和CglibAutoProxyConfiguration。

概述

自动配置AopAutoConfiguration类的主要任务是根据配置参数使用注解@EnableAspectJAutoProxy

该自动配置类通过注解声明了自己生效的条件是 :

  1. 以下类必须存在于classpath :
    • EnableAspectJAutoProxy
    • Aspect
    • Advice
    • AnnotatedElement
  2. 配置参数spring.aop.auto值不为false

    如果该参数未使用则相当于spring.aop.auto值为true

AopAutoConfiguration又包含了如下两个内置配置类,分别对应配置参数spring.aop.proxy-target-class值为true/false两种情况 :

注意,如果配置参数spring.aop.proxy-target-class未被设置,则将这种情况作为spring.aop.proxy-target-class值为true来理解。

  • JdkDynamicAutoProxyConfiguration
    • spring.aop.proxy-target-classfalse时生效
    • 生效时使用注解@EnableAspectJAutoProxy(proxyTargetClass = false)
  • CglibAutoProxyConfiguration
    • spring.aop.proxy-target-classfalse或者缺失时生效
    • 生效时使用注解@EnableAspectJAutoProxy(proxyTargetClass = true)

从上面分析可以看出,AopAutoConfiguration主要是综合使用如下两个配置参数决定如何使用注解@EnableAspectJAutoProxy :

  • spring.aop.auto
  • spring.aop.proxy-target-class

如果spring.aop.auto未被设置为false,则@EnableAspectJAutoProxy一定会被使用。而@EnableAspectJAutoProxy使用的效果,主要就是导入AspectJAutoProxyRegistrar。而AspectJAutoProxyRegistrar最终是通过AopConfigUtils注册了一个AOP代理对象创建器bean到容器 :

源代码

源代码版本 : spring-boot-autoconfigure-2.1.3.RELEASE

package org.springframework.boot.autoconfigure.aop;

// 忽略 import 行
/**
 * org.springframework.boot.autoconfigure.EnableAutoConfiguration
 * Auto-configuration for Spring's AOP support. Equivalent to enabling
 * org.springframework.context.annotation.EnableAspectJAutoProxy in your
 * configuration.
 * 
 * The configuration will not be activated if spring.aop.auto=false. The
 * proxyTargetClass attribute will be true, by default, but can be
 * overridden by specifying spring.aop.proxy-target-class=false.
 *
 */
@Configuration
// 仅在这些类存在于 classpath 时生效
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class,
		AnnotatedElement.class })
// 仅在属性 spring.aop.auto 缺失或者明确指定为 true 时生效         
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {

	@Configuration
	@EnableAspectJAutoProxy(proxyTargetClass = false)
	// 在配置参数 spring.aop.proxy-target-class 值被明确设置为 false 时生效
	@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", 
		havingValue = "false", matchIfMissing = false)
	public static class JdkDynamicAutoProxyConfiguration {

	}

    
	@Configuration
	@EnableAspectJAutoProxy(proxyTargetClass = true)
	// 在配置参数 spring.aop.proxy-target-class 缺失或者值被明确设置为 true 时生效    
	@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", 
		havingValue = "true", matchIfMissing = true)
	public static class CglibAutoProxyConfiguration {

	}

}

相关文章

<think> 我们需要回答关于Spring Boot自动配置流程的问题,并在最后按照规则提出3-5个相关问题。 回答要求使用中文,并且在末尾必须包含“§§相关问题§§”开头的问题列表。 Spring Boot自动配置流程的核心是尝试根据类路径、已存在的Bean定义和属性配置等条件自动配置应用程序。以下是主要步骤: 1. **启动类和@SpringBootApplication注解**:Spring Boot应用通常以带有`@SpringBootApplication`注解的类作为入口。该注解组合了三个核心注解: - `@SpringBootConfiguration`:标记为配置类。 - `@ComponentScan`:自动扫描当前包及其子包下的组件。 - `@EnableAutoConfiguration`:启用自动配置机制。 2. **@EnableAutoConfiguration的作用**:该注解通过`@Import`导入了`AutoConfigurationImportSelector`类。该类会读取`META-INF/spring.factories`文件中定义的自动配置类列表(key为`org.springframework.boot.autoconfigure.EnableAutoConfiguration`)。 3. **加载自动配置类**:`AutoConfigurationImportSelector`使用SpringFactoriesLoader加载所有自动配置类(如DataSourceAutoConfiguration、WebMvcAutoConfiguration等)。这些配置类通常带有`@Configuration`注解,并包含条件注解(如`@ConditionalOnClass`、`@ConditionalOnMissingBean`)来控制是否生效。 4. **条件注解评估**:每个自动配置类中包含的条件注解由`ConditionEvaluator`进行评估。例如: - `@ConditionalOnClass`:当类路径中存在指定类时才生效。 - `@ConditionalOnMissingBean`:当容器中不存在指定Bean时才生效。 这样确保了自动配置只在满足特定条件时应用,避免与用户自定义配置冲突。 5. **创建和注册Bean**:满足条件的自动配置类会向容器中注册Bean。例如,当类路径有H2数据库时,DataSourceAutoConfiguration会自动配置内存数据源。 6. **属性绑定**:自动配置类通常会结合`@ConfigurationProperties`将属性文件(如application.properties)中的值绑定到配置Bean上,从而实现外部化配置。 整个过程在Spring应用上下文刷新阶段完成,最终实现“约定优于配置”,简化开发。 §§相关问题§§ 1. Spring Boot中`@Conditional`注解的工作原理是什么? 2. 如何自定义一个Spring Boot自动配置类? 3. 在什么情况下自动配置会失效,如何排查? 4. Spring Boot自动配置与显式配置(如@Bean)的优先级顺序是怎样的? </think> ### Spring Boot自动配置流程 Spring Boot自动配置是其核心特性之一,旨在根据项目依赖和配置自动装配Bean,减少手动配置。其流程如下: 1. **启动入口与注解触发** - 通过`@SpringBootApplication`注解标记主类,该注解组合了三个核心功能: - `@SpringBootConfiguration`:标识为配置类 - `@ComponentScan`:扫描当前包及子包的组件(如`@Controller`, `@Service`) - `@EnableAutoConfiguration`:**启用自动配置的关键注解**,通过`@Import`导入`AutoConfigurationImportSelector`类 2. **加载自动配置类** - `AutoConfigurationImportSelector`调用`SpringFactoriesLoader.loadFactoryNames()`方法 - 从所有JAR包的`META-INF/spring.factories`文件中读取`org.springframework.boot.autoconfigure.EnableAutoConfiguration`键对应的配置类列表 - 例如:`spring-boot-autoconfigure.jar`中定义`DataSourceAutoConfiguration`、`WebMvcAutoConfiguration`等 3. **条件化配置评估** 每个自动配置类包含**条件注解**,由`ConditionEvaluator`在运行时评估: - `@ConditionalOnClass`:类路径存在指定类时生效(如存在`Servlet.class`才启用Web配置) - `@ConditionalOnMissingBean`:容器无该类型Bean时生效(避免覆盖用户自定义Bean) - `@ConditionalOnProperty`:匹配配置文件属性(如`spring.datasource.url`) ```java @Configuration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) public class DataSourceAutoConfiguration { // 自动配置数据源 } ``` 4. **Bean注册与属性绑定** - 满足条件的配置类通过`@Bean`方法向Spring容器注册组件 - 结合`@ConfigurationProperties`将`application.properties`中的属性(如`server.port=8080`)绑定到Bean - 示例:`ServerProperties`类绑定`server.*`前缀属性 5. **执行顺序控制** - 通过`@AutoConfigureOrder`、`@AutoConfigureBefore`等注解控制配置类的加载顺序 - 例如:`AopAutoConfiguration`需在数据源配置前加载 整个过程在**应用上下文刷新阶段**(`AbstractApplicationContext.refresh()`)完成,最终实现"约定优于配置"。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值