在Spring中,使用AOP(面向切面编程)时,Spring框架会基于你的配置或注解来决定哪些方法需要被增强(即应用额外的行为,如日志记录、事务管理等)。当只有部分方法被指定为需要AOP处理时,Spring会根据这些配置动态地生成代理对象,并确保只有那些被标记为需要增强的方法在执行时会通过代理逻辑。
代理对象的生成
Spring AOP默认使用JDK动态代理或CGLIB代理来创建代理对象,具体使用哪种代理方式取决于目标对象的类型:
- JDK动态代理:要求目标对象实现至少一个接口。Spring会为每个这样的目标对象生成一个实现了目标对象所有接口的代理类。这个代理类会在方法调用时插入切面逻辑。
- CGLIB代理:如果目标对象没有实现任何接口,Spring将使用CGLIB库来生成目标对象的子类,并在子类中插入切面逻辑。
方法执行流程
当代理对象被创建后,对于通过代理对象调用的方法,执行流程会稍有不同:
-
调用代理对象的方法:当调用者调用代理对象上的方法时,实际上是在调用代理对象的相应方法。
-
判断是否需要增强:代理对象会根据配置或注解检查当前调用的方法是否需要被增强。如果方法被标记为需要AOP处理,代理对象会拦截这个调用。
-
执行切面逻辑:如果需要增强,代理对象会先执行切面的前置通知(Before advice),然后调用目标方法,之后可以执行后置通知(After advice)、返回通知(After Returning advice)或异常通知(After Throwing advice)等。
-
调用目标方法:如果方法不需要增强,或者切面逻辑已经执行完毕,代理对象会直接调用目标对象上的原始方法。
-
返回结果:目标方法执行完毕后,如果有返回值,并且存在返回通知,则返回通知会被执行,并最终将结果返回给调用者。
只有一个方法被AOP
如果只有一个方法被AOP增强,其他方法没有被增强,Spring仍然会按照上述流程创建代理对象。但是,当调用那些没有被增强的方法时,代理对象会直接调用目标对象上的原始方法,不会插入任何切面逻辑。
因此,Spring的AOP机制是非常灵活的,允许你细粒度地控制哪些方法需要被增强,而不会影响到其他方法的正常执行。
标签:调用,Spring,对象,spring,AOP,代理,aop,方法 From: https://www.cnblogs.com/super-chao/p/18422571