Spring的两种代理方式:JDK动态代理和CGLIB动态代理
- JDK动态代理
若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
优点:因为有接口,所以使系统更加松耦合
缺点:为每一个目标类创建接口
- CGLIB动态代理
若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。
在service内部调用增删改等包含事务操作的方法:
1.在内部调用必须获取service的代理类进行调用,不然直接调用会出现无事务现象(未经过代理,则事务无法织入,即此时调用的未普通方法,必不包含事务。)
2.获取代理对象方式:
(1)获取AopContext:
<aop:aspectj-autoproxy="true"-proxy"true"/>
((Service) AopContext.currentProxy()).callMethod();
(2)通过ApplicationContextjproxy=ctx.getBean(service);
proxy.callsMethod();