Java springaop中代理的使用
我正在读一本书,其中谈到在SpringAOP中启用AspectJ支持 以下是摘自该书的一段: 要在SpringIOC容器中启用AspectJ注释支持,只需定义一个空的 XML元素aop:bean配置文件中的aspectj autoproxy。然后,弹簧将自动 为任何与AspectJ特性匹配的bean创建代理 对于接口不可用或未在应用程序设计中使用的情况,可以 通过依赖CGLIB创建代理。要启用CGLIB,需要在Java springaop中代理的使用,java,spring,aop,aspectj,Java,Spring,Aop,Aspectj,我正在读一本书,其中谈到在SpringAOP中启用AspectJ支持 以下是摘自该书的一段: 要在SpringIOC容器中启用AspectJ注释支持,只需定义一个空的 XML元素aop:bean配置文件中的aspectj autoproxy。然后,弹簧将自动 为任何与AspectJ特性匹配的bean创建代理 对于接口不可用或未在应用程序设计中使用的情况,可以 通过依赖CGLIB创建代理。要启用CGLIB,需要在中设置属性proxy target class=true 我看不懂第二段。什么是“接
中设置属性proxy target class=true
我看不懂第二段。什么是“接口不可用”。有人能用一个例子来说明这一点吗?Spring更喜欢使用AOP接口,因为它可以使用JDK 例如,假设我有一个接口
MyService
public interface MyService {
void doSomething();
}
以及一个实现MyServiceImpl
@Service
public class MyServiceImpl implements MyService {
public void doSomething() {
// does something!
}
}
如果Spring发现您已经为MyService
配置了方面,它将创建一个实现MyService
的JDK代理,然后代理所有调用到MyServiceImpl
bean,在适当的地方添加方面功能
JDK代理通过实现与目标对象相同的接口并将调用委派给它来工作;如果没有要实现的接口,它们就不起作用。如果没有上述接口,Spring需要使用像CGLIB这样的字节码库在运行时动态创建包含方面功能的类。Spring AOP使用JDK动态代理或CGLIB为目标对象创建代理 根据Spring文档,如果您的目标实现了至少一个接口,那么将使用JDK动态代理。但是,如果目标对象未实现任何接口,则将创建CGLIB代理 这就是如何强制创建CGLIB代理(设置代理目标类=“true”):
文档了解更多详细信息。Spring AOP广泛使用代理作为一种机制,以非侵入方式实现横切关注点(也称为方面),其基本思想是将代理用作包装器,以丰富原始行为,即添加事务功能
要实现这一点,有两个选项,具体取决于原始对象是否实现了接口
在第一种情况下(原始对象实现至少一个接口),反射API的动态代理功能用于创建代理对象,该代理对象实现与原始对象相同的接口,因此可以使用代理
在第二种情况下(原始对象没有实现任何接口),因此必须使用更详细的技巧,这就是CGLIB出现的时候。根据项目页面“CGLIB用于扩展Java类并在运行时实现接口”。因此,在本例中,技巧在于创建一个代理扩展原始对象,因此可以使用它。我发现了一个博客,它清楚地解释了AOP、缓存和事务是如何使用运行时代理类工作的
当不向接口编码时(引用博客的“一节,如果bean类没有实现任何接口怎么办?”):-
默认情况下,如果您的bean没有实现接口,Spring将使用
技术继承:在启动时,创建一个新类。信息技术
从bean类继承并在子方法中添加行为。
为了生成这样的代理,Spring使用第三方库
称为cglib
<aop:config proxy-target-class="true">
<!-- other beans defined here... -->
</aop:config>
<aop:aspectj-autoproxy proxy-target-class="true"/>