spring查看自定義的bean

1 場(chǎng)景

spring的bean命名空間中,除了spring內(nèi)部的bean乎芳,還有自己定義的bean。有時(shí)候帖池,我們需要確定自己定義的bean哪些生效了奈惑。

2 步驟

使用spring的applicationContext.getBeanDefinitionNames(),來(lái)獲取命名空間內(nèi)所有的bean的name睡汹,然后根據(jù)bean的name獲取bean的class信息肴甸,根據(jù)需要的bean的包路徑,來(lái)過(guò)濾出自己需要的bean的信息囚巴。

需要的bean的信息原在,主要包括:bean的類路徑,和bean的name彤叉。

其中同一個(gè)bean的類型下庶柿,有可能有多個(gè)name。如下:

public class UserServiceImplC implements UserService {
}
@Bean
public UserServiceImplC userServiceImplC1() {
return new UserServiceImplC();
}
@Bean
public UserServiceImplC userServiceImplC2() {
return new UserServiceImplC();
}

3 代碼

3.1 準(zhǔn)備

定義如下工具類秽浇,可以在非spring命名空間內(nèi)用來(lái)獲取spring命名空間:

@Component
public class SpringContextUtil implements ApplicationContextAware {
    
    private static ApplicationContext applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }
    
    /**
     * 獲取spring命名空間
     * @return
     */
    public static ApplicationContext getSpringContext(){
        return SpringContextUtil.applicationContext;
    }
}

在spring命名空間內(nèi)浮庐,通過(guò)如下方式注入ApplicationContext即可:

@Autowired
private ApplicationContext applicationContext;

3.2 實(shí)現(xiàn)

// 過(guò)濾bean路徑前綴
String beanClassPathPrefix = "com.sa.example.sp.service.impl";

// spring命名空間
ApplicationContext applicationContext = SpringContextUtil.getSpringContext();
// 過(guò)濾后結(jié)果
List<Map<String, String>> beanList = Arrays.stream(applicationContext.getBeanDefinitionNames())
    // 轉(zhuǎn)換流內(nèi)容為"bean對(duì)象路徑"、"bean名稱"的對(duì)象
    .map(beanName -> {
        Map<String, String> map = new HashMap<>();
        String className = applicationContext.getBean(beanName).getClass().getName();
        map.put("beanName", beanName);
        map.put("beanClassPath", className);
        return map;
    })
    // 過(guò)濾非自定義bean(根據(jù)包路徑過(guò)濾)
    .filter(map -> map.get("beanClassPath").startsWith(beanClassPathPrefix))
    // 按照bean類型排序
    .sorted(Comparator.comparing(map -> map.get("beanClassPath")))
    // 輸出結(jié)果為L(zhǎng)ist
    .collect(Collectors.toList());

// --------------------測(cè)試柬焕,輸出結(jié)果--------------------
beanList.stream().forEach(map -> {
    System.out.println("bean類路徑:" + map.get("beanClassPath") + "审残,bean名稱:" + map.get("beanName"));
});

輸出內(nèi)容如下:

bean類路徑:com.sa.example.sp.service.impl.UserServiceImplA,bean名稱:userServiceImplA
bean類路徑:com.sa.example.sp.service.impl.UserServiceImplB斑举,bean名稱:userServiceImplB
bean類路徑:com.sa.example.sp.service.impl.UserServiceImplC搅轿,bean名稱:userServiceImplC1
bean類路徑:com.sa.example.sp.service.impl.UserServiceImplC,bean名稱:userServiceImplC2

4 補(bǔ)充

如果想獲取某個(gè)類富玷,有哪些bean的實(shí)例璧坟,可以通過(guò)如下方法:

applicationContext.getBeanNamesForType(UserServiceImplC.class)

返回的結(jié)果没宾,為此java類對(duì)應(yīng)的bean的name,如下:

[userServiceImplC1, userServiceImplC2]

如果沸柔,java類不存在對(duì)應(yīng)的bean的實(shí)例,則返回空的字符串?dāng)?shù)組

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铲敛,一起剝皮案震驚了整個(gè)濱河市褐澎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伐蒋,老刑警劉巖工三,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異先鱼,居然都是意外死亡俭正,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門焙畔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掸读,“玉大人,你說(shuō)我怎么就攤上這事宏多《梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵伸但,是天一觀的道長(zhǎng)肾请。 經(jīng)常有香客問(wèn)我,道長(zhǎng)更胖,這世上最難降的妖魔是什么铛铁? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮却妨,結(jié)果婚禮上饵逐,老公的妹妹穿的比我還像新娘。我一直安慰自己管呵,他們只是感情好梳毙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捐下,像睡著了一般账锹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坷襟,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天奸柬,我揣著相機(jī)與錄音,去河邊找鬼婴程。 笑死廓奕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桌粉,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蒸绩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了铃肯?” 一聲冷哼從身側(cè)響起患亿,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎押逼,沒想到半個(gè)月后步藕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挑格,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年咙冗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漂彤。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雾消,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仪或,到底是詐尸還是另有隱情士骤,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布到旦,位于F島的核電站添忘,受9級(jí)特大地震影響若锁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仲器,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一乏冀、第九天 我趴在偏房一處隱蔽的房頂上張望洋只。 院中可真熱鬧昼捍,春花似錦妒茬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谨履。三九已至熬丧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間害捕,已是汗流浹背闷畸。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工佑菩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赴精。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓蕾哟,卻偏偏與公主長(zhǎng)得像谭确,于是被迫代替她去往敵國(guó)和親菇夸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容