Spring Boot 自动配置 : AopAutoConfiguration

概述

自动配置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 {

	}

}

相关文章

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值