springboot aop的实现方式有哪些
在 Spring Boot 中,AOP(面向切面编程)是通过 Spring Framework 提供的 AOP 模块来实现的。Spring AOP 提供了几种实现方式来应用切面编程,包括以下几种:
-
基于代理的 AOP: 这是 Spring AOP 的默认实现方式。它基于代理对象来实现切面编程,使用 JDK 动态代理或 CGLIB 动态代理来创建代理对象,并将切面逻辑织入到代理对象中。
-
基于切面的 AOP: 基于切面的 AOP 是通过 AspectJ 框架来实现的,它提供了更强大和灵活的切面功能,可以实现更细粒度的切面控制和更复杂的切面逻辑。
在 Spring Boot 中,默认情况下会使用基于代理的 AOP 来实现切面编程,根据目标对象是否实现接口的情况,选择使用 JDK 动态代理或 CGLIB 动态代理。Spring Boot 也提供了一些自定义配置选项,可以根据需要选择合适的 AOP 实现方式。
另外,如果需要更高级、更复杂的切面编程功能,也可以选择使用 AspectJ 框架,并与 Spring Boot 集成。AspectJ 提供了更灵活、更强大的切面编程能力,但相应地也增加了复杂性和学习曲线。
springboot判断使用哪种代理的源码
Spring Boot 在选择使用哪种代理的过程中,实际上是借助了 Spring Framework 的 AOP 模块来进行判断和选择的。Spring AOP 提供了相应的逻辑来确定使用 JDK 动态代理还是 CGLIB 动态代理。
具体来说,Spring AOP 的逻辑是基于目标类是否实现了接口来选择使用哪种代理。以下是 Spring AOP 选择代理的源码逻辑:
-
如果目标类实现了接口,Spring AOP 将会使用 JDK 动态代理。这是因为 JDK 动态代理要求目标类实现接口,因此它只能代理接口,无法代理类。
-
如果目标类没有实现接口,Spring AOP 将会尝试使用 CGLIB 动态代理。CGLIB 动态代理可以代理没有实现接口的类,通过生成目标类的子类来实现代理。
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
//如果配置了代理,且用户未提供代理自定义代理接口
if (!NativeDetector.inNativeImage() &&
(config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config))) {
Class<?> targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
//如果目标类实现了接口,Spring AOP 将会使用 JDK 动态代理
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
//否则使用cglib
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
在 Spring AOP 中,这个逻辑主要体现在 AdvisedSupport
类和 ProxyFactory
类中。这两个类分别负责对代理逻辑的处理和代理对象的创建。在实际使用过程中,可以通过调试这些类的源码来更深入地了解 Spring AOP 是如何选择代理的。
代理对象的创建过程
ProxyFactoryBean是Spring框架提供的一个工厂bean,用于创建代理对象。它可以用来为目标对象创建动态代理,以实现AOP(面向切面编程)的功能。
ProxyFactoryBean的主要作用是将目标对象包装在一个代理对象中,并在代理对象的方法执行前后插入额外的逻辑。这些额外的逻辑可以是事务管理、日志记录、性能监控等。