国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Spring Boot 中的 AOP,到底是 JDK 動(dòng)態(tài)代理還是 Cglib 動(dòng)態(tài)代理?

開發(fā) 前端
Spring 中的 AOP,有接口就用 JDK 動(dòng)態(tài)代理,沒有接口就用 Cglib 動(dòng)態(tài)代理。 Spring Boot 中的 AOP,2.0 之前和 Spring 一樣;2.0 之后首選 Cglib 動(dòng)態(tài)代理,如果用戶想要使用 JDK 動(dòng)態(tài)代理,需要自己手動(dòng)配置。

好啦,開始今天的正文。

大家都知道,AOP 底層是動(dòng)態(tài)代理,而 Java 中的動(dòng)態(tài)代理有兩種實(shí)現(xiàn)方式:

  • 基于 JDK 的動(dòng)態(tài)代理
  • 基于 Cglib 的動(dòng)態(tài)代理

這兩者最大的區(qū)別在于基于 JDK 的動(dòng)態(tài)代理需要被代理的對(duì)象有接口,而基于 Cglib 的動(dòng)態(tài)代理并不需要被代理對(duì)象有接口。

那么小伙伴們不禁要問,Spring 中的 AOP 是怎么實(shí)現(xiàn)的?是基于 JDK 的動(dòng)態(tài)代理還是基于 Cglib 的動(dòng)態(tài)代理?

1. Spring

先來(lái)說結(jié)論,Spring 中的動(dòng)態(tài)代理,具體用哪種,分情況:

如果代理對(duì)象有接口,就用 JDK 動(dòng)態(tài)代理,否則就是 Cglib 動(dòng)態(tài)代理。

如果代理對(duì)象沒有接口,那么就直接是 Cglib 動(dòng)態(tài)代理。

來(lái)看看這段來(lái)自官方文檔的說辭:

圖片

可以看到,即使在最新版的 Spring 中,依然是如上策略不變。即能用 JDK 做動(dòng)態(tài)代理就用 JDK,不能用 JDK 做動(dòng)態(tài)代理就用 Cglib,即首選 JDK 做動(dòng)態(tài)代理。

2. Spring Boot

Spring Boot 和 Spring 一脈相承,那么在動(dòng)態(tài)代理這個(gè)問題上是否也是相同的策略呢?抱歉,這個(gè)還真不一樣。

Spring Boot 中對(duì)這個(gè)問題的處理,以 Spring Boot2.0 為節(jié)點(diǎn),前后不一樣。

在 Spring Boot2.0 之前,關(guān)于 Aop 的自動(dòng)化配置代碼是這樣的(Spring Boot 1.5.22.RELEASE):

@Configuration
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class })
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = false)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",
matchIfMissing = true)
public static class JdkDynamicAutoProxyConfiguration {

}

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
matchIfMissing = false)
public static class CglibAutoProxyConfiguration {

}

}

可以看到,這個(gè)自動(dòng)化配置主要是在討論 application.properties 配置文件中的 spring.aop.proxy-target-class 屬性的值。

具體起作用的是 @ConditionalOnProperty 注解,關(guān)于這個(gè)注解中的幾個(gè)屬性,松哥也來(lái)稍微說下:

  • prefix:配置文件的前綴。
  • name:配置文件的名字,和 prefix 共同組成配置的 key。
  • having:期待配置的值,如果實(shí)際的配置和 having 的值相同,則這個(gè)配置就會(huì)生效,否則不生效。
  • matchIfMissing:如果開發(fā)者沒有在 application.properties 中進(jìn)行配置,那么這個(gè)配置類是否生效。

基于如上介紹,我們很容易看出:

  • 如果開發(fā)者設(shè)置了spring.aop.proxy-target-class 為 false,則使用 JDK 代理。
  • 如果開發(fā)者設(shè)置了spring.aop.proxy-target-class 為 true,則使用 Cglib 代理。
  • 如果開發(fā)者一開始就沒配置spring.aop.proxy-target-class 屬性,則使用 JDK 代理。
  • 這是 Spring Boot 2.0 之前的情況。

再來(lái)看看 Spring Boot 2.0(含)之后的情況(Spring Boot 2.0.0.RELEASE):

@Configuration
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class,
AnnotatedElement.class })
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = false)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = false)
public static class JdkDynamicAutoProxyConfiguration {

}

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
public static class CglibAutoProxyConfiguration {

}

}

可以看到,大部分配置都是一樣的,有一個(gè)地方不太相同,那就是 matchIfMissing 屬性的值。可以看到,從 Spring Boot2.0 開始,如果用戶什么都沒有配置,那么默認(rèn)情況下使用的是 Cglib 代理。

3. 實(shí)踐

最后我們寫一個(gè)簡(jiǎn)單的例子驗(yàn)證一下我們的想法。

首先創(chuàng)建一個(gè) Spring Boot 項(xiàng)目(本案例使用最新版 Spring Boot,即默認(rèn)使用 Cglib 代理),加入三個(gè)依賴即可,如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

接下來(lái)我們創(chuàng)建一個(gè) IUserService 接口,如下:

public interface IUserService {
void hello();
}

然后我們?cè)賮?lái)創(chuàng)建一個(gè)該接口的實(shí)現(xiàn)類:

@Service
public class UserServiceImpl implements IUserService {
@Override
public void hello() {

}
}

方法不用實(shí)現(xiàn)。

再來(lái)一個(gè)簡(jiǎn)單的切面:

@EnableAspectJAutoProxy
@Aspect
@Component
public class LogAspect {
@Before("execution(* org.javaboy.demo.UserServiceImpl.*(..))")
public void before(JoinPoint jp) {
System.out.println("jp.getSignature().getName() = " + jp.getSignature().getName());
}
}

最后再來(lái)一個(gè)簡(jiǎn)單的測(cè)試方法,注入 IUserService 實(shí)例:

@RestController
public class HelloController {
@Autowired
IUserService iUserService;
@GetMapping("/hello")
public void hello() {
iUserService.hello();
}
}

DBUEG 運(yùn)行一下,就可以看到 IUserService 是通過 Cglib 來(lái)代理的。

圖片

如果我們想用 JDK 來(lái)代理,那么只需要在 application.properties 中添加如下配置即可:

spring.aop.proxy-target-class=false

添加完成后,重新 DEBUG,如下圖:

圖片

可以看到,已經(jīng)使用了 JDK 動(dòng)態(tài)代理了。

如果用的是 Spring Boot 1.5.22.RELEASE 這個(gè)版本,那么即使不在 application.properties 中添加配置,默認(rèn)也是 JDK 代理,這個(gè)我就不測(cè)試了,小伙伴們可以自己來(lái)試試。

4. 小結(jié)

總結(jié)一下:

  • Spring 中的 AOP,有接口就用 JDK 動(dòng)態(tài)代理,沒有接口就用 Cglib 動(dòng)態(tài)代理。
  • Spring Boot 中的 AOP,2.0 之前和 Spring 一樣;2.0 之后首選 Cglib 動(dòng)態(tài)代理,如果用戶想要使用 JDK 動(dòng)態(tài)代理,需要自己手動(dòng)配置。

just this。

責(zé)任編輯:武曉燕 來(lái)源: 江南一點(diǎn)雨
相關(guān)推薦

2023-12-06 08:23:44

代理模式設(shè)計(jì)模式

2024-09-05 09:35:58

CGLIBSpring動(dòng)態(tài)代理

2021-07-14 11:07:56

AOPJDKCglib

2024-01-04 07:42:44

JavaCGLIBJDK

2025-02-27 00:32:35

2021-04-22 09:58:15

JDK代理動(dòng)態(tài)

2019-11-29 16:21:22

Spring框架集成

2021-07-06 06:39:22

Java靜態(tài)代理動(dòng)態(tài)代理

2022-12-26 07:37:23

Nacos代理模式運(yùn)用場(chǎng)景、

2023-07-05 08:17:38

JDK動(dòng)態(tài)代理接口

2017-05-11 21:30:01

Android動(dòng)態(tài)代理ServiceHook

2011-04-06 11:41:25

Java動(dòng)態(tài)代理

2022-07-05 14:19:30

Spring接口CGLIB

2015-09-22 11:09:47

Java 8動(dòng)態(tài)代理

2009-06-22 15:10:00

java 編程AOP

2020-12-29 05:34:00

動(dòng)態(tài)代理

2012-08-28 10:59:26

JavaJava動(dòng)態(tài)代理Proxy

2022-02-22 22:44:46

接口源碼對(duì)象

2025-07-29 07:30:23

Spring動(dòng)態(tài)代理代碼

2011-03-23 10:40:51

java代理模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品国产成人国产三级 | 91免费高清视频| 女人被男人躁得好爽免费视频| 日本三级在线播放完整版| 天天av天天翘天天综合网| 亚洲欧美日韩一区二区 | 免费看成人吃奶视频在线| 成人免费毛片高清视频| 国产青青在线视频| 99久久综合精品| 青青视频在线播放| 久久亚洲精品国产精品紫薇| 一区二区三区四区五区视频| 国产主播一区二区| 日韩一级免费看| 国产自产视频一区二区三区| 久久99导航| 国产欧美一区二区精品久久久| 日韩你懂的电影在线观看| 热久久精品免费视频| 日韩**一区毛片| 国产伦精品一区二区三区精品视频 | 91精品国产91| 熟妇熟女乱妇乱女网站| 美女国产精品| 日本不卡一区二区三区在线观看 | www.久草.com| 《视频一区视频二区| 黄色无遮挡网站| 一区二区三区四区精品在线视频| 午夜视频免费在线观看| 99热精品国产| 九色porny91| 69堂精品视频| 久久国产这里只有精品| jizz性欧美23| 欧美成人精品xxx| 久久要要av| 欧美日韩中文字幕| 国产三级在线免费观看| 日韩va亚洲va欧洲va国产| 一呦二呦三呦国产精品| 奇米影视首页 狠狠色丁香婷婷久久综合| 中文字幕的久久| 婷婷五月在线视频| 青草成人免费视频| 日本成人超碰在线观看| 国产裸舞福利在线视频合集| 欧美亚洲国产一卡| 成人一区二区不卡免费| 日韩精品中文在线观看| 久久久久久毛片免费看| 97精品视频在线播放| 国产探花在线精品| 黄色99视频| 久久久青草婷婷精品综合日韩| 亚洲国产精品女人| 久久激情婷婷| 亚洲免费人成在线视频观看| 成人午夜888| 国产成人精品亚洲精品| 亚洲人成精品久久久久| 日韩欧国产精品一区综合无码| 26uuu久久噜噜噜噜| 日本v片在线高清不卡在线观看| 好看的日韩精品视频在线| 亚洲综合激情另类小说区| 欧美日本不卡| 久久99九九| 波多野洁衣一区| 青草影视电视剧免费播放在线观看| 国产91在线视频| 葵司免费一区二区三区四区五区| 啊啊啊射了视频网站| 一本一道综合狠狠老| 大陆一级毛片| 欧美激情在线免费观看| 国产精品我不卡| 91在线视频官网| 日韩一区精品| 亚洲自拍偷拍av| 久操视频在线| 激情五月五月婷婷| 亚洲欧美日韩天堂| 成人毛片在线观看| 日韩黄色三级| 蜜臀av免费观看| 国产精品私拍pans大尺度在线| 中文字幕欧美一区| 国产永久精品大片wwwapp| 日本中文字幕一区二区有码在线| 中文字幕精品在线视频| 丝袜亚洲另类丝袜在线| 免费av在线电影| 国产精品日韩欧美综合| 亚洲乱码国产乱码精品精的特点| 久久爱www.| www..com日韩| 亚洲男人av在线| 国产人成精品一区二区三| 中文字幕www| 精品视频在线播放色网色视频| 中文字幕一区二区三区在线视频| 日本视频一二区| 成人av资源在线播放| 久久福利影院| 99re在线观看| 欧美在线观看一二区| 久久99精品国产麻豆婷婷洗澡| 伊人精品综合| 日韩一级裸体免费视频| 精品一区二区三区的国产在线播放| 你懂的在线观看一区二区| 三级在线观看视频| 亚洲成人男人天堂| 久久久久国产精品熟女影院| 国产精品久久久久久免费观看| 中文字幕一精品亚洲无线一区| 色88888久久久久久影院野外 | 水蜜桃在线视频| 亚洲精品9999| 麻豆国产精品va在线观看不卡| 久久精品一级爱片| 欧美影院三区| 在线观看完整版免费| 热re99久久精品国99热蜜月| 亚洲男子天堂网| 成人国产精品免费观看动漫| 精品无人区麻豆乱码久久久| aiai在线| 国产又粗又爽又黄的视频 | 国产日韩另类视频一区| www.69av| 国产ts人妖一区二区三区| 亚洲欧美激情一区| 亚洲综合久久av| 24小时成人在线视频| 午夜影院观看视频免费| 亚洲在线视频一区二区| 美女性感视频久久久| 亚洲国产另类av| 99久久国产综合精品女不卡| 国产精品男女| 激情影院在线观看| 国产综合免费视频| 国产精品播放| 久久精品视频网站| 欧美日韩五月天| 久久国产精品第一页| 爱高潮www亚洲精品| 黄色片网站在线| 99爱免费视频| 91动漫在线看| 另类图片亚洲另类| 久久久久久久久99精品| 在线精品一区二区| 国产日韩欧美一区在线| 国产一区激情| 久久久久久免费毛片精品| 免费在线黄色影片| 黄色片免费在线观看视频| 在线观看一区二区三区三州| 成熟了的熟妇毛茸茸| 88av.com| 一级毛片视频在线| 日本精品在线观看| 午夜在线一区| 国产日本欧洲亚洲| 欧洲在线/亚洲| 亚洲精品久久久久久久久久久| 色偷偷综合社区| 欧美剧在线观看| 欧美丰满老妇厨房牲生活| 亚洲第一页中文字幕| 欧美精品aaa| 成人高清视频观看www| 96国产粉嫩美女| 91九色偷拍| 裸模一区二区三区免费| 欧美福利精品| 一区二区三区四区视频在线观看| 88av.com| 思思99re6国产在线播放| 91在线精品| 国产视频三区| 2021中文字幕在线| 国产精品一区2区3区| 精品一区二区三区中文字幕视频 | 欧美一区二区视频在线观看2020| 亚洲最大中文字幕| av一区二区三区四区电影| 鲁一鲁一鲁一鲁一色| 高清欧美性猛交| 国内精品中文字幕| 韩国无码av片在线观看网站| 国产精品xx| 香蕉久久国产| 在线一区二区三区四区| 97精品欧美一区二区三区| 成人免费aaa|