每个人都知道AOP的底层是动态代理,有两种方法可以在Java中实现动态代理:
两者之间的最大区别是,基于JDK的动态代理需要需要代理的接口,并且基于CGLIB的动态代理不需要由代理对象解释。
然后,小朋友不禁要问,春季的AOP是如何意识到的?是基于JDK的动态代理还是基于CGLIB的动态代理?
首先,春季的动态代理,什么样的用途和情况:
让我们从官方文件中看一下此会议:
可以看出,即使在最新版本的春季版本中,上述策略仍然相同。也就是说,将JDK用作动态代理,使用JDK。您不能将JDK用作使用CGLIB的动态代理,即JDK的首选作为动态代理。
Spring Boot和Spring处于相同的脉冲中,因此在动态代理问题上是相同的策略吗?对不起,这确实不同。
Spring Boot中此问题的处理将Spring Boot 2.0作为节点,该节点在之前和之后都不同。
在Spring Boot2.0之前,AOP的自动配置代码如下(Spring Boot):
可以看出,这种自动配置主要是讨论application.properties配置文件中属性的值。
具体作用是注释。关于此注释的属性,我也说了一点:
基于上述简介,我们可以轻松地看到:
这是Spring Boot 2.00之前的情况。
让我们看一下Spring Boot 2.0之后的情况(包括):Spring Boot:
可以看出,大多数配置都是相同的,并且有一个不同的位置,也就是说,匹配属性的值。可以看到,如果用户没有配置,则从Spring Boot2.0开始,那么默认情况下使用CGLIB代理。
最后,我们写了一个简单的例子来验证我们的想法。
首先创建一个Spring Boot项目(此情况使用最新版本的Spring Boot,即使用CGLIB代理默认情况下),添加三个依赖项,如下:
接下来,我们创建一个IuserService界面,如下:
然后,让我们创建一个接口的实现类:
该方法无需实施。
另一个简单的切面表面:
最后,另一种简单的测试方法是注入IuserService的实例:
DBUEG运行,您可以看到IuserService由CGLIB代表。
如果我们要使用JDK进行代理,我们只需要在应用程序中添加以下配置。
添加完成后,请重新删除,如下所示:
可以看出,已经使用了JDK动态代理。
如果您使用Spring Boot 1.5.22.Release的版本,那么即使您没有在应用程序中添加配置。我不会测试。朋友可以自己尝试。
综上所述:
只是这个。