国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

詳解關(guān)于spring bean名稱命名的那些事

瀏覽:5日期:2023-07-03 15:46:01
目錄前言02源碼查看01從main方法直接調(diào)試斷點(diǎn)02帶著問(wèn)題查看,靠猜加驗(yàn)證的方式03源碼驗(yàn)證04總結(jié)前言

用了多年spring,一直想當(dāng)然把spring默認(rèn)的beanName當(dāng)成是類名的首字母小寫,比如HelloService其beanName為helloService。直到有天對(duì)接了供方廠商的接口,他有個(gè)類形如ABService,于是用

getBean(“aBService”)

的方式獲取bean,結(jié)果取到是null,一開(kāi)始以為是ABservice沒(méi)注入,后面采用

getBean(ABService.class)

能成功獲取到bean,說(shuō)明ABService是有注入到IOC容器中,但是為啥用aBService獲取不到bean?于是就用如下代碼段,打印出相應(yīng)ABService對(duì)應(yīng)的beanName

applicationContext.getBeansOfType(ABService.class).forEach((beanName,bean)->{ System.out.println(beanName + ':' + bean);});

打印出來(lái)的結(jié)果,如下

ABService:com.github.lybgeek.ABService@245b6b85

beanName竟然是ABService,這就和之前的想當(dāng)然有出入。于是只好查看源碼

02源碼查看

源碼查看有2種方式,本文的示例是springboot項(xiàng)目

01從main方法直接調(diào)試斷點(diǎn)

詳解關(guān)于spring bean名稱命名的那些事

從圖可以看出如果是以掃描注解注入形式,其beanName的生成規(guī)則是由

org.springframework.context.annotation.AnnotationBeanNameGenerator#generateBeanName

決定。

ps: 這種直接從main啟動(dòng)類調(diào)試起,比較適用于時(shí)間比較多,或者排查毫無(wú)頭緒

02帶著問(wèn)題查看,靠猜加驗(yàn)證的方式

利用idea的find Usage查找引用,比如ABService的注解@service,我們可以直接查看哪個(gè)引用到@Service,再猜測(cè)下beanName的生成規(guī)則

詳解關(guān)于spring bean名稱命名的那些事

通過(guò)猜,我們基本上就可以定位出比較符合我們需求的方法

03源碼驗(yàn)證

從上面的分析,我們可以知道如果是掃描bean注解注入的方式,其生成beanName規(guī)則,是在

org.springframework.context.annotation.AnnotationBeanNameGenerator

其生成規(guī)則代碼如下

@Override public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { if (definition instanceof AnnotatedBeanDefinition) { String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition); if (StringUtils.hasText(beanName)) {// Explicit bean name found.return beanName; } } // Fallback: generate a unique default bean name. return buildDefaultBeanName(definition, registry); }

從代碼段,我們可以看出,注解上有取名,比如@Service(“abService”),則beanName為abService,如果沒(méi)有取名,則看

protected String buildDefaultBeanName(BeanDefinition definition) { String beanClassName = definition.getBeanClassName(); Assert.state(beanClassName != null, 'No bean class name set'); String shortClassName = ClassUtils.getShortName(beanClassName); return Introspector.decapitalize(shortClassName); }

public static String decapitalize(String name) {if (name == null || name.length() == 0) { return name;}if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){ return name;}char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]);return new String(chars); }

其實(shí)從代碼我們就很容易看出答案了,如果類名前兩個(gè)或以上個(gè)字母都是大寫,則beanName和類名就一樣了,不會(huì)進(jìn)行首字母小寫轉(zhuǎn)換。

decapitalize這個(gè)方法的注釋也寫得很清楚,注釋如下

/** * Utility method to take a string and convert it to normal Java variable * name capitalization. This normally means converting the first * character from upper case to lower case, but in the (unusual) special * case when there is more than one character and both the first and * second characters are upper case, we leave it alone. * <p> * Thus 'FooBah' becomes 'fooBah' and 'X' becomes 'x', but 'URL' stays * as 'URL'. * * @param name The string to be decapitalized. * @return The decapitalized version of the string. */04總結(jié)

通過(guò)掃描bean注解注入IOC時(shí),如果不指定bean名稱的默認(rèn)規(guī)則是類名的首字母小寫,如果類名前兩個(gè)或以上個(gè)字母都是大寫,那么bean名稱與類名一樣。

其實(shí)這個(gè)細(xì)節(jié)可能懂的都懂,本文的彩蛋主要是分享一下平時(shí)查看源碼的一點(diǎn)心得吧,哈哈

到此這篇關(guān)于spring bean名稱命名的文章就介紹到這了,更多相關(guān)spring bean名稱命名內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 美女毛片免费看 | www黄网站| 午夜性爽爽爽 | 1717she国产精品免费视频 | 91亚洲人成手机在线观看 | 欧美高清在线视频一区二区 | 欧美精选欧美极品 | 日韩视频在线观看一区二区 | 欧美jlzz18性欧美 | 日韩一区二区天海翼 | 久久久久亚洲香蕉网 | 国产成人精品日本亚洲语音1 | 成人欧美在线观看 | 欧美九九视频 | 最新欧美精品一区二区三区不卡 | 日产一区二区三区四区 | 亚洲人的天堂男人爽爽爽 | 欧美一级大片在线观看 | 日本特黄a级高清免费酷网 日本特黄特色 | 超91精品手机国产在线 | 深夜福利视频在线观看免费视频 | 亚洲精品一区91 | 国产性精品| 亚洲精品欧美精品国产精品 | 一级毛片日韩a欧美 | 91欧美激情一区二区三区成人 | 中文字幕在线视频观看 | 成人做爰在线视频 | 欧美成人se01短视频在线看 | 国产成人免费高清视频网址 | 日韩午夜在线观看 | 亚洲天堂二区 | 亚洲一区浅井舞香在线播放 | www.欧美成人| 欧美成人精品欧美一级乱黄 | 亚洲国产2017男人a天堂 | 亚洲美女aⅴ久久久91 | 国产韩国精品一区二区三区 | 9久9久热精品视频在线观看 | 国产午夜精品不卡视频 | 国产精品亚洲欧美日韩一区在线 |