Spring的AOP的限制:
aop无法拦截方法内部的调用,假如有方法
public class AccountServiceImpl implements AccoutService{
@Transactional
public void increment(Account account, int amount){
doXXX();
}
@Transactional
public void decrement(Account account, int amount) {
doXXX();
}
public void transform(Account from,Account to,int amout){
decrement(from,amount);
increment(to,amount);
}
}
transform方法内部的decrement();increment()虽然有Transactional,但是事物拦截器不会拦截到这两个方法调用
cglib则可以解决此类问题,cglib的代理可以通过字节码增强,生成代理类型的子类型,并创建对象。
但,在spring中不论你用cglib,还是jdk动态代理都会存在上述问题。
根本原因是spring的代理是基于目标对象的代理而不是像cglib一样直接生成目标类型的子类型,像静态代理一样对目标对象的方法调用做一层包裹,并不管目标对象方法的内部调用。
看看Spring的
private static class CglibMethodInvocation extends ReflectiveMethodInvocation {
private final MethodProxy methodProxy;
private boolean protectedMethod;
public CglibMethodInvocation(Object proxy, Object target, Method method, Object[] arguments,
Class targetClass, List<Object> interceptorsAndDynamicMethodMatchers, MethodProxy methodProxy) {
super(proxy, target, method, arguments, targetClass, interceptorsAndDynamicMethodMatchers);
this.methodProxy = methodProxy;
this.protectedMethod = Modifier.isProtected(method.getModifiers());
}
/**
* Gives a marginal performance improvement versus using reflection to
* invoke the target when invoking public methods.
*/
@Override
protected Object invokeJoinpoint() throws Throwable {
if (this.protectedMethod) {
return super.invokeJoinpoint();
}
else {
return this.methodProxy.invoke(this.target, this.arguments);
}
}
}
看到其中的return this.methodProxy.invoke(this.target, this.arguments); 在target目标上直接做invoke,所以不论methodProxy内部有什么方法调用
spring都是无法感知的
分享到:
相关推荐
本文将深入探讨“Redis Spring 并发限制动态代理”这一主题,解释如何通过动态代理技术实现对Redis连接的智能管理,以及线程池的并发限制策略。 首先,让我们理解什么是动态代理。动态代理是Java中的一种设计模式,...
标题中的“spring mail通过代理发送邮件”涉及到的是Spring框架中处理电子邮件发送的功能,尤其是在网络环境有限制或需要通过代理服务器的情况下。Spring Mail是Spring Framework的一个扩展模块,它提供了与JavaMail...
静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib
- 虽然Java动态代理能实现简单的AOP功能,但它有一些限制。例如,它只能代理实现了接口的类,而不能代理没有接口或实现了多个接口的类。Spring AOP通过CGLIB库解决了这个问题,可以代理任何类。 - Spring AOP提供...
Spring Cloud 是一个用于快速构建分布式系统的工具集,提供了配置管理、服务发现、断路器、智能路由、微代理、控制总线等多种功能。这些功能可以帮助开发人员快速地支持实现分布式系统中的常见模式,例如服务注册和...
- JDK动态代理需要目标对象实现至少一个接口,而CGLIB不需此限制,但创建代理对象的性能略逊于JDK动态代理。 - 对于大型项目,合理选择代理方式对性能有一定影响,通常建议优先尝试使用JDK动态代理。 在Day01_...
第5章 动态代理和经典的Spring AOP 第6章 Spring 2.x AOP和AspectJ支持 第二部分 基础主题 第7章 Spring对JDBC的支持 第8章 Spring中的事务管理 第9章 Spring对ORM的支持 第10章...
这两个库在Spring框架中的协同工作,使得Spring能够灵活地处理各种类型的类,并实现高效的AOP代理。它们对于提高代码的可维护性、可测试性和整体性能都有着重要作用。在实际开发中,理解这些底层机制可以帮助开发者...
第5章 动态代理和经典的Spring AOP 第6章 Spring 2.x AOP和AspectJ支持 第二部分 基础主题 第7章 Spring对JDBC的支持 第8章 Spring中的事务管理 第9章 Spring对ORM的支持 第10章...
在Spring AOP中,有两种代理方式:静态代理和动态代理。 1.1. 静态代理 在静态代理中,我们创建一个代理类,该代理类实现了与目标对象相同的接口,并在代理类的方法中添加额外的逻辑,如记录日志。这种方式的缺点...
`springframework-license.txt`文件是Spring框架的许可协议,通常包含了Apache License 2.0或其他开源许可条款,它定义了用户使用Spring框架的法律权限和限制,强调了开源软件的开放源码、自由修改和分发的原则。...
接着,"spring-objenesis-repack-2.1.jar"则是Objenesis库的一个打包版本,Objenesis主要用于在没有无参构造函数或者构造函数带有访问限制的类中创建实例。在某些情况下,如CGLIB的初始化过程中,可能需要在运行时...
可以通过Spring Security对服务进行权限控制,限制Flex客户端的访问权限。同时,数据传输应进行加密,例如使用HTTPS协议。 7. **异常处理**:在Spring服务端捕获的异常需要被适当地包装并传递给Flex客户端,以便...
- 代理(Proxy):Spring创建的对象,用于在实际的目标对象前后插入通知。可以是JDK动态代理或CGLIB代理。 五、应用场景 Spring AOP常用于以下场景: - 日志记录:在方法执行前后记录日志信息。 - 事务管理:自动...
JDK动态代理由于基于接口,对非接口类无法处理,而CGLIB则无此限制,但CGLIB的性能相对较低。在实际应用中,应根据具体需求和性能要求选择合适的代理方式。 总之,Spring AOP通过代理技术实现了面向切面编程,使得...
Spring的动态代理开发是Spring框架中的重要特性,它主要用于实现面向切面编程(AOP)。AOP是一种编程范式,允许我们在不修改原有代码的情况下,插入额外的功能,比如日志记录、事务管理、性能监控等。Spring提供了两...
JDK动态代理要求目标对象实现至少一个接口,而CGLIB则不需要这个限制,它通过继承目标类来创建代理对象。 要使用CGLIB,我们并不需要单独引入CGLIB的jar包,因为Spring核心库中已经包含了对CGLIB的依赖。这意味着,...
Spring Cloud是一套微服务架构下的分布式系统解决方案,提供了在分布式系统环境下快速构建一些常见模式的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...