日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

spring @Lazy延遲注入的邏輯實現

瀏覽:14日期:2023-06-27 10:20:45
目錄前言一、一個簡單的小例子二、源碼解讀1. 注入2. 使用邏輯總結前言

有時候我們會在屬性注入的時候添加@Lazy注解實現延遲注入,今天咱們通過閱讀源碼來分析下原因

一、一個簡單的小例子

代碼如下:

@Servicepublic class NormalService1 {@Autowired@Lazyprivate MyService myService;public void doSomething() {myService.getName();}}

作用是為了進行延遲加載,在NormalService1進行屬性注入的時候,如果MyService還沒有生成bean也不用擔心,會注入一個代理,但是在實際運行的時候,會獲取Spring容器中實際的MyService,在某些情況下,因為spring生命周期的原因,這個注解有大用。

二、源碼解讀1. 注入

代碼如下(DefaultListableBeanFactory#resolveDependency):

public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());if (Optional.class == descriptor.getDependencyType()) {return createOptionalDependency(descriptor, requestingBeanName);}else if (ObjectFactory.class == descriptor.getDependencyType() ||ObjectProvider.class == descriptor.getDependencyType()) {return new DependencyObjectProvider(descriptor, requestingBeanName);}else if (javaxInjectProviderClass == descriptor.getDependencyType()) {return new Jsr330Factory().createDependencyProvider(descriptor, requestingBeanName);}else {//如果注入屬性添加了@Lazy,懶加載,此時spring會根據具體類型搞個cglib代理類Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(descriptor, requestingBeanName);if (result == null) {result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);}return result;}}

很明顯要執行getLazyResolutionProxyIfNecessary方法,如果加了@Lazy注解,最終會執行buildLazyResolutionProxy方法

protected Object buildLazyResolutionProxy(final DependencyDescriptor descriptor, final @Nullable String beanName) {Assert.state(getBeanFactory() instanceof DefaultListableBeanFactory,'BeanFactory needs to be a DefaultListableBeanFactory');final DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) getBeanFactory();TargetSource ts = new TargetSource() {@Overridepublic Class<?> getTargetClass() {return descriptor.getDependencyType();}@Overridepublic boolean isStatic() {return false;}@Overridepublic Object getTarget() {Object target = beanFactory.doResolveDependency(descriptor, beanName, null, null);/**something valid**/return target;}@Overridepublic void releaseTarget(Object target) {}};ProxyFactory pf = new ProxyFactory();pf.setTargetSource(ts);Class<?> dependencyType = descriptor.getDependencyType();if (dependencyType.isInterface()) {pf.addInterface(dependencyType);}return pf.getProxy(beanFactory.getBeanClassLoader());}

可以看到上面這段代碼,其實就是生成了一個TargetSource,然后再生成了一個代理(CGLIB或者JDK),然后作為MyService對象注入給了NormalService1。那么所謂的執行的過程中才進行獲取真正的MyService對象是什么意思呢?

2. 使用邏輯

本文示例代碼使用的是CGLIB代理,其實是類似的,因為注入的MyService是個CGLIB代理對象,那么在執行方法的時候,就會調用CglibAopProxy#DynamicAdvisedInterceptor#intercept方法

spring @Lazy延遲注入的邏輯實現

那么此處其實調用的就是上面的

Object target = beanFactory.doResolveDependency(descriptor, beanName, null, null);

這個方法就不用認真看了,主要功能就是從Spring容器中找到MyService。在之前講@Autowired原理和@Resource注入原理的時候解釋過了,不清楚的可以看專欄里其他文章。拿出來之后會發現,咱們拿到的target對象還是一個CGLIB增加的對象

spring @Lazy延遲注入的邏輯實現

那么當執行方法邏輯時

spring @Lazy延遲注入的邏輯實現

由于target是CGLIB對象,會再次進入到CglibAopProxy#DynamicAdvisedInterceptor#intercept方法。此時拿到的target對象類型就不同了

spring @Lazy延遲注入的邏輯實現

是我們代理之前的target對象,此時再次進行invoke的時候,就會進行動態代理的一般邏輯,先查找該方法匹配的所有advice,然后依次調用,最終調用target本身對于方法的執行。

總結

所以可以發現其實@Lazy只不過是給spring的代理對象proxy再進行了一次proxy,只不過沒有在注入的時候,就獲取到對象,而是借用了方法invoke時通過proxy的intercept方法getTarget,然后進行方法調用,延遲了對象的注入。之后每次調用的時候都需要從Spring容器中獲取到原生的proxy對象。

spring @Lazy延遲注入的邏輯實現

到此這篇關于spring @Lazy延遲注入的邏輯實現的文章就介紹到這了,更多相關spring @Lazy延遲注入內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩在线欧美| 国产一区二区三区免费在线 | 美女91精品| 91国语精品自产拍| 狠狠色综合网| 亚洲一区日韩| 黄色国产精品| 午夜在线视频一区二区区别| 人人爽香蕉精品| 午夜天堂精品久久久久| 国产亚洲人成a在线v网站| 国产精选一区| 欧美日韩在线观看首页| 久久在线电影| 天堂va欧美ⅴa亚洲va一国产| 91精品国产自产在线丝袜啪| 久久久久亚洲精品中文字幕| 久久精品动漫| 亚洲精品动态| 加勒比视频一区| 尹人成人综合网| 日本精品一区二区三区在线观看视频| 国产精品一二| 亚洲成人av观看| 中文字幕日韩欧美精品高清在线| 国产香蕉精品| 日韩影院二区| 一本一道久久a久久精品蜜桃| 男女男精品视频网| 一区二区不卡| 日日夜夜免费精品| 国产精品99久久久久久董美香| 麻豆精品久久久| 国产精品精品国产一区二区| 中文av在线全新| 久久伦理在线| 不卡在线一区| 日本成人一区二区| 麻豆久久久久久| 成人久久一区| 亚洲人成网77777色在线播放| 国产美女久久| 亚洲午夜国产成人| 欧美激情网址| 亚洲国产成人精品女人| 日韩国产欧美一区二区三区| 麻豆免费精品视频| 99成人超碰| 亚洲精品系列| 日韩不卡一区| 亚洲欧美日韩在线观看a三区| 亚洲小说春色综合另类电影| 美女免费视频一区| 欧美1区免费| 日韩福利视频一区| 久久91视频| 人人精品亚洲| 国产情侣久久| 美女网站一区| 国产精品久久久久久久久久白浆| 日韩成人综合| 久久电影一区| 国模精品一区| 99xxxx成人网| 久久亚洲人体| 视频一区免费在线观看| 国产日韩三级| 99成人在线视频| 日韩精品视频一区二区三区| 国内一区二区三区| 99国产精品久久久久久久成人热| 欧美日韩 国产精品| 99精品视频精品精品视频| 欧美偷窥清纯综合图区| 久久久一二三| 亚洲欧美日韩精品一区二区| 欧美精品国产白浆久久久久| 日韩视频一区二区三区在线播放免费观看 | 日韩动漫一区| 久久蜜桃资源一区二区老牛| 日本精品在线播放| 久久久成人网| 国产精品久久久久毛片大屁完整版 | 黄色欧美在线| 青青草精品视频| 欧美日韩国产欧| 国产一区二区三区免费在线| 亚洲精品动态| 在线综合视频| av资源中文在线| 久久97视频| 亚洲尤物av| 黄色亚洲在线| 久久黄色影院| 精品一区二区三区四区五区| 欧美亚洲三级| 亚洲精选成人| 中文欧美日韩| 99久久精品网| 欧美成人基地| а√天堂8资源中文在线| 中文字幕av一区二区三区人 | 亚洲一区二区三区中文字幕在线观看| 成人在线丰满少妇av| 91欧美极品| 国产综合精品| 超碰成人av| 国产精品一区二区三区四区在线观看| 日韩精品亚洲aⅴ在线影院| 国产亚洲永久域名| 亚洲男女av一区二区| 91综合网人人| 精品视频网站| 精品一区二区三区视频在线播放 | 亚洲福利一区| 91看片一区| 鲁鲁在线中文| 伊人久久在线| 成人精品中文字幕| 中国字幕a在线看韩国电影| 麻豆精品一区二区综合av| 欧美在线首页| 国产精品18| 精品一级视频| 91亚洲国产| 在线天堂中文资源最新版| 今天的高清视频免费播放成人| 亚洲va在线| 波多野结衣一区| 国产精品美女久久久浪潮软件| 女同性一区二区三区人了人一| 日韩欧美综合| 尤物tv在线精品| 欧美+亚洲+精品+三区| 国产精品试看| 亚洲日本免费电影| 国产欧美日韩视频在线 | 亚洲免费福利一区| 日本午夜免费一区二区| 91麻豆精品激情在线观看最新 | 亚洲特色特黄| 尤物网精品视频| 亚洲免费毛片| 国产另类在线| 久久久久久自在自线| 99精品小视频| 久久国产精品亚洲77777| 在线精品福利| 国产精品v一区二区三区| 精品国产美女a久久9999| 日本黄色精品| 国产一区亚洲| 99视频一区| 热久久久久久| 老牛影视精品| 日产精品一区二区| 欧美不卡高清| 亚洲资源网站| 99视频精品视频高清免费| 亚洲精品成人一区| 精品视频一区二区三区在线观看| 日韩网站中文字幕| 综合一区av| 精品国产鲁一鲁****| 午夜国产一区二区| 国产亚洲人成a在线v网站| 日韩欧美一区二区三区在线视频 | 999久久久精品国产| 视频一区欧美日韩| 精品91福利视频| 国产精品呻吟| 老鸭窝一区二区久久精品| 久久精品国产99久久| 亚洲精品少妇| 国产99在线| 青青草视频一区| 不卡在线一区二区| 久久精品亚洲| 麻豆精品网站| 性欧美69xoxoxoxo| 国产欧美一区二区三区米奇| 欧美理论视频| 欧美激情视频一区二区三区免费| 欧美日韩精品免费观看视完整| 美国三级日本三级久久99| 高清精品久久| 国产精品久久| 鲁大师成人一区二区三区 | 成人精品国产亚洲| 中文字幕乱码亚洲无线精品一区| 国产成人a视频高清在线观看| 日韩精品社区| 欧美日韩国产观看视频| 麻豆精品国产91久久久久久| 一二三区精品| 国产精品毛片一区二区三区| 国产精品精品国产一区二区| 日韩中文字幕| 欧美亚洲人成在线| 中文无码久久精品|