springboot aop详解

springboot aop的实现方式有哪些

在 Spring Boot 中,AOP(面向切面编程)是通过 Spring Framework 提供的 AOP 模块来实现的。Spring AOP 提供了几种实现方式来应用切面编程,包括以下几种:

  1. 基于代理的 AOP: 这是 Spring AOP 的默认实现方式。它基于代理对象来实现切面编程,使用 JDK 动态代理或 CGLIB 动态代理来创建代理对象,并将切面逻辑织入到代理对象中。

  2. 基于切面的 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 选择代理的源码逻辑:

  1. 如果目标类实现了接口,Spring AOP 将会使用 JDK 动态代理。这是因为 JDK 动态代理要求目标类实现接口,因此它只能代理接口,无法代理类。

  2. 如果目标类没有实现接口,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 是如何选择代理的。

springboot aop详解_第1张图片

代理对象的创建过程

ProxyFactoryBean是Spring框架提供的一个工厂bean,用于创建代理对象。它可以用来为目标对象创建动态代理,以实现AOP(面向切面编程)的功能。

ProxyFactoryBean的主要作用是将目标对象包装在一个代理对象中,并在代理对象的方法执行前后插入额外的逻辑。这些额外的逻辑可以是事务管理、日志记录、性能监控等。

springboot aop详解_第2张图片

你可能感兴趣的:(spring,boot,java,后端)