Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java springaop中代理的使用_Java_Spring_Aop_Aspectj - Fatal编程技术网

Java springaop中代理的使用

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 我看不懂第二段。什么是“接

我正在读一本书,其中谈到在SpringAOP中启用AspectJ支持

以下是摘自该书的一段:

要在SpringIOC容器中启用AspectJ注释支持,只需定义一个空的 XML元素aop:bean配置文件中的aspectj autoproxy。然后,弹簧将自动 为任何与AspectJ特性匹配的bean创建代理

对于接口不可用或未在应用程序设计中使用的情况,可以 通过依赖CGLIB创建代理。要启用CGLIB,需要在
中设置属性
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"/>