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

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Bean的包掃描的實(shí)現(xiàn)方法

瀏覽:28日期:2023-07-26 16:15:27

我們知道,Spring可以通過包掃描將使用@Component注解定義的Bean定義到容器中。今天就來探究下他實(shí)現(xiàn)的原理。

首先,找到@Component注解的處理類

注解的定義,一般都需要配套的對(duì)注解的處理才能完成注解所代表的功能。所以我們通過@Component注解的用到的地方,來查找可能的處理邏輯;我們先進(jìn)入Spring的項(xiàng)目,在IDEA里面用Ctrl和鼠標(biāo)左鍵點(diǎn)擊Component注解的名稱,IDEA會(huì)顯示出使用到這個(gè)類的位置,我們從彈出的列表中找到一個(gè)名稱像的類,去看類上面的注釋說明,如圖:

Spring Bean的包掃描的實(shí)現(xiàn)方法

我們點(diǎn)進(jìn)類中,可以看到第一行就說了這個(gè)類是為了從classpath里面找到定義的Bean:

Spring Bean的包掃描的實(shí)現(xiàn)方法

分析具體方法

一般Spring的類都是經(jīng)過設(shè)計(jì)的,職責(zé)清晰。所以一般都是有簡(jiǎn)單直接的接口暴露,我們打開類的公開API可以看到有個(gè)很直接的方法就叫做掃描,看看注釋說“從指定的包中掃描Bean”,那就是它了。

Spring Bean的包掃描的實(shí)現(xiàn)方法

然后,我們?yōu)榱舜_認(rèn),實(shí)現(xiàn)確實(shí)是通過這個(gè)方法,可以啟動(dòng)程序,打個(gè)斷點(diǎn)看看是否經(jīng)過這里(但是這這里,沒有調(diào)用scan()方法,而是更深一層的doScan方法,也確實(shí)費(fèi)解)。

我們進(jìn)入doScan() 方法看看實(shí)現(xiàn):

protected Set<BeanDefinitionHolder> doScan(String... basePackages) {Assert.notEmpty(basePackages, 'At least one base package must be specified');Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();// 可以指定多個(gè)basePackage,這里就對(duì)每個(gè)都處理for (String basePackage : basePackages) { // 這個(gè)方法是真正的查找候選Bean的地方Set<BeanDefinition> candidates = findCandidateComponents(basePackage);// 對(duì)于每個(gè)查找出的候選Bean,進(jìn)行處理for (BeanDefinition candidate : candidates) { // 解析@Scope的元數(shù)據(jù)ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);candidate.setScope(scopeMetadata.getScopeName());// 為候選的Bean生成一個(gè)名稱String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);// 應(yīng)用后置處理器if (candidate instanceof AbstractBeanDefinition) {postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);}// // 處理一些其它通用的注解的元數(shù)據(jù)if (candidate instanceof AnnotatedBeanDefinition) {AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);}// 校驗(yàn)通過后,注冊(cè)到 BeanFactoryif (checkCandidate(beanName, candidate)) {BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);definitionHolder =AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);beanDefinitions.add(definitionHolder);registerBeanDefinition(definitionHolder, this.registry);}}}return beanDefinitions;}

從方法中我們可以明顯的看到,核心代碼還在findCandidateComponents方法里面,我們進(jìn)入這個(gè)方法后再通過調(diào)試一直找到核心代碼scanCandidateComponents。如下圖,第一處是找到指定包路徑所代表的classpath中的資源對(duì)象, 但是這里只是找到了包下面有什么,但是還不知道包下面的類是不是一個(gè)候選的Bean(可以看到將DTO類也掃描到了)。如下:

Spring Bean的包掃描的實(shí)現(xiàn)方法

正常思路,拿到了有哪些資源就該進(jìn)一步去篩選,看看這些資源有哪些是真正的Bean的定義類。

現(xiàn)在我們還不清楚的是,Spring通過什么方式知道一個(gè)類是否是真正的Bean的。我們繼續(xù)調(diào)試,到上圖的430行debug進(jìn)去看看,可以走到org.springframework.core.type.classreading.SimpleMetadataReader這個(gè)類的構(gòu)造器中,如下:

SimpleMetadataReader(Resource resource, @Nullable ClassLoader classLoader) throws IOException { // 通過流讀取資源的內(nèi)容,現(xiàn)在這個(gè)資源可以認(rèn)為是我們的類InputStream is = new BufferedInputStream(resource.getInputStream());ClassReader classReader;try { // 這個(gè)Reader的構(gòu)造器中就將流讀取完畢了classReader = new ClassReader(is);}catch (IllegalArgumentException ex) { // 通過這個(gè)異常的信息,可以推測(cè)出,其實(shí)這里是通過ASM讀取Class文件的定義了throw new NestedIOException('ASM ClassReader failed to parse class file - ' +'probably due to a new Java class file version that isn’t supported yet: ' + resource, ex);}finally {is.close();} // 這里根據(jù)命名可以推測(cè)是訪問者模式來暴露注解的元數(shù)據(jù)AnnotationMetadataReadingVisitor visitor = new AnnotationMetadataReadingVisitor(classLoader);// 這個(gè)accpect方法也是訪問者模式中的典型方法,在這里面,是數(shù)據(jù)的解析邏輯classReader.accept(visitor, ClassReader.SKIP_DEBUG);this.annotationMetadata = visitor;// (since AnnotationMetadataReadingVisitor extends ClassMetadataReadingVisitor)this.classMetadata = visitor;this.resource = resource;}

我們?cè)谶M(jìn)入classReader.accept方法,這里面可以看到reader對(duì)于Class文件的的按字節(jié)解析。

Spring Bean的包掃描的實(shí)現(xiàn)方法

例如,下面讀取的類聲明,類注解都是包掃描需要的類元數(shù)據(jù):

Spring Bean的包掃描的實(shí)現(xiàn)方法

拿到這些元數(shù)據(jù)之后,就按照包掃描的過濾器就過濾出真正需要的類,作為候選的Bean

Spring Bean的包掃描的實(shí)現(xiàn)方法

獲取到元數(shù)據(jù)之后,就可以按部就班對(duì)Bean進(jìn)行注冊(cè)、初始化等一系列邏輯啦~

總結(jié) 包掃描是通過讀取包對(duì)應(yīng)的類路徑下的class文件后,對(duì)class文件進(jìn)行解析元數(shù)據(jù)的方式,確定了Bean的定義的; 本地IDEA的啟動(dòng)方式可能和Jar包方式尋找資源的方式略有不同,但是思路是一致的,都是按照第一點(diǎn)查找;

到此這篇關(guān)于Spring Bean的包掃描的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Spring Bean掃描包內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩成人一级| 色爱综合网欧美| 国产欧美一区二区三区国产幕精品 | 亚洲黄色网址| 欧美日韩一区自拍| 日韩视频免费| 欧美1区免费| 久久激情中文| 日韩欧美午夜| 手机在线电影一区| 精品三级在线| 免费看一区二区三区| 日韩av三区| 涩涩涩久久久成人精品| 亚洲欧美久久久| 色爱av综合网| 五月激情久久| 日韩精品电影| 亚洲午夜一级| 久久性天堂网| 日韩中文字幕麻豆| 中文在线日韩| 欧美日韩一区二区三区四区在线观看| 亚洲精品福利| 久久国内精品| 国产一区二区视频在线看| 日韩免费av| av亚洲在线观看| 一区二区日韩免费看| 日韩制服丝袜先锋影音| 伊人久久成人| 久久国产尿小便嘘嘘| 在线亚洲欧美| 蜜桃免费网站一区二区三区| 日韩精品一二三区| 亚洲毛片一区| 国产精品入口久久| 韩国女主播一区二区三区| 国产一区二区三区久久 | 美女网站久久| 亚洲精品无吗| 国产精品成人**免费视频| 欧美日本一区| 成人综合一区| 黄色亚洲免费| 国产精品网站在线看| 久久男人天堂| 亚洲一区免费| 激情综合五月| 免费不卡在线视频| 久久久精品国产**网站| 亚洲日本网址| 97久久亚洲| 99久久激情| 一本综合精品| 精品国产亚洲一区二区三区大结局 | 亚洲精品黄色| 日韩不卡在线| 欧美日韩亚洲一区三区| 亚洲精品一二三区区别| 激情久久99| 国产乱子精品一区二区在线观看 | 日韩中文在线电影| 亚洲精品综合| 久久久久久久久99精品大| 国产精品久久久久毛片大屁完整版| 日韩午夜免费| 99热精品久久| 日韩免费久久| 国产一区二区三区亚洲综合| 中文精品电影| 婷婷成人综合| 欧美羞羞视频| 国产网站在线| 福利视频一区| 欧美国产免费| 精品一区视频| 国产精品啊啊啊| 日本午夜精品视频在线观看| 蜜臀久久99精品久久久画质超高清| 欧美午夜精彩| 国产一区导航| 首页欧美精品中文字幕| 蜜桃av一区二区在线观看| 首页国产欧美日韩丝袜| 超碰99在线| 亚洲欧洲免费| 亚洲精品系列| 国产精品一区二区三区www| 国产三级精品三级在线观看国产| 欧美国产先锋| 精品一区二区三区中文字幕| 国产一区三区在线播放| 国产精品一页| 久久一区国产| 欧美日韩精品免费观看视完整| 久久蜜桃精品| 亚洲一区欧美二区| 国产日韩免费| 日韩综合精品| 免费在线视频一区| 青草国产精品久久久久久| 精品欧美日韩精品| 亚洲网站视频| **爰片久久毛片| 三上悠亚国产精品一区二区三区| 欧美99久久| 日本v片在线高清不卡在线观看| 久久国产乱子精品免费女| 精品国产欧美日韩一区二区三区| 99视频精品全部免费在线视频| 在线一区视频| 国产高清亚洲| 亚洲一区观看| 中文在线а√在线8| 色综合视频一区二区三区日韩| 伊人网在线播放| 日韩av电影一区| 亚洲黄页一区| 国产精品久久久久蜜臀| 亚洲精品视频一二三区| 久久成人av| 国产一区91| 色黄视频在线观看| 丝袜美腿亚洲色图| 日韩大片在线播放| 欧美日韩夜夜| 天堂成人国产精品一区| 日韩欧美一区二区三区在线观看| 日韩精品国产欧美| 宅男噜噜噜66国产日韩在线观看| 天堂av在线| 欧美日韩国产一区二区在线观看| 久久人人精品| 国产资源在线观看入口av| 石原莉奈在线亚洲三区| 精品国产亚洲一区二区三区大结局| 日韩一区二区三区免费视频 | 亚洲视频综合| 中文一区一区三区高中清不卡免费| 综合在线一区| 亚洲一级在线| 国产视频一区三区| 喷白浆一区二区| 玖玖精品视频| 日韩av在线免费观看不卡| 日韩一区二区三区精品| 日本精品另类| 国产精品久久久久久久免费软件 | 亚洲深夜av| 国产精品嫩草99av在线| 亚洲精品在线观看91| 在线视频日韩| 天堂精品久久久久| 国产美女视频一区二区| 国产精品久一| 在线天堂资源www在线污| 久久男女视频| 伊人久久亚洲美女图片| 日韩视频一区二区三区在线播放免费观看| 久久影院一区| 免费国产亚洲视频| 国产日产一区| 精品九九久久| 亚洲人成在线网站| 丝袜亚洲另类欧美| 国产精品亚洲四区在线观看| 国产精品亚洲一区二区三区在线观看| 1000部精品久久久久久久久| 国产视频一区在线观看一区免费| 亚洲精品亚洲人成在线观看| 久久精品xxxxx| 中文字幕系列一区| 亚洲人成毛片在线播放女女| 国产精品99久久免费| 亚洲a在线视频| 红桃视频国产精品| 国产欧美午夜| 99久久精品网站| 日韩一区二区久久| 91精品国产经典在线观看| 国产一区二区三区91| 日韩精品一二三四| 美日韩一区二区三区| 久久久久亚洲| 日本免费新一区视频| 精品一区在线| 国产伦理久久久久久妇女| 亚洲精品极品少妇16p| 免费一级欧美在线观看视频 | 99久久激情| 免费在线欧美黄色| 日韩欧美中文字幕在线视频| 精品国产三区在线| 欧美日韩在线精品一区二区三区激情综合 | 亚洲少妇一区| 国产在线观看www| 麻豆mv在线观看| 日韩影院二区| 午夜精品网站|