av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

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

Spring 應(yīng)用上下文獲取 Bean 的常用姿勢實例總結(jié)

瀏覽:116日期:2023-09-04 18:40:44

本文實例講述了Spring 應(yīng)用上下文獲取 Bean 的常用姿勢。分享給大家供大家參考,具體如下:

1. 前言

通常,在Spring應(yīng)用程序中,當(dāng)我們使用 @Bean,@Service,@Controller,@Configuration 或者其它特定的注解將 Bean 注入 Spring IoC 。然后我們可以使用 Spring 框架提供的 @Autowired 或者 JSR250JSR330 規(guī)范注解來使用由 Spring IoC 管理的 Bean

2. 從應(yīng)用程序上下文中獲取 Bean

今天我們將來學(xué)習(xí)如何從 ApplicationContext 中獲取 Bean 。因為有些情況下我們不得不從應(yīng)用程序上下文中來獲取 Bean

2.1 獲取所有的 Bean

ApplicationContext 提供了獲取所有已經(jīng)成功注入 Spring IoC 容器的 Bean 名稱的方法 getBeanDefinitionNames() 。然后我們可以借助于其 getBean(String name) 方法使用 Bean 名稱獲取特定的 Bean。 我們使用之前文章中介紹的 CommandLineRunner 接口來打印一下結(jié)果。

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import java.util.stream.Stream; /** * @author Felordcn */ @SpringBootApplication public class WarSpringBootApplication implements CommandLineRunner { @Autowired private ApplicationContext applicationContext; public static void main(String[] args) { SpringApplication.run(WarSpringBootApplication.class, args); } @Override public void run(String... args) throws Exception { String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); Stream.of(beanDefinitionNames).forEach(beanName->{ System.out.println('beanName : ' + beanName);Object bean = applicationContext.getBean(beanName);System.out.println('Spring bean : ' + bean); }); } }

運(yùn)行應(yīng)用會輸出:

2019-11-05 22:15:54.392 INFO 6356 --- [ main] cn.felord.war.WarSpringBootApplication : Started WarSpringBootApplication in 4.663 seconds (JVM running for 7.58) beanName : org.springframework.context.annotation.internalConfigurationAnnotationProcessor Spring bean : org.springframework.context.annotation.ConfigurationClassPostProcessor@6c44052e beanName : org.springframework.context.annotation.internalAutowiredAnnotationProcessor Spring bean : org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor@5c371e13 beanName : org.springframework.context.annotation.internalCommonAnnotationProcessor Spring bean : org.springframework.context.annotation.CommonAnnotationBeanPostProcessor@530a8454 beanName : org.springframework.context.event.internalEventListenerProcessor Spring bean : org.springframework.context.event.EventListenerMethodProcessor@1e34c607 beanName : org.springframework.context.event.internalEventListenerFactory Spring bean : org.springframework.context.event.DefaultEventListenerFactory@5215cd9a beanName : fooController Spring bean : cn.felord.war.controller.FooController@31198ceb beanName : IServiceImpl Spring bean : cn.felord.war.controller.IServiceImpl@51671b08 <more...>2.2 通過名稱獲取特定的 Bean

從上面打印的信息我們也能看出來一些端倪。

有的 beanName 是類全限定名。 @Component、@Repository、@Service、@Controller等注解創(chuàng)建 Bean 時,如果不指定bean名稱,名稱的默認(rèn)規(guī)則是類名的首字母小寫,如 cn.felord.war.controller.FooController 為 fooController。如果類名前兩個或以上個字母都是大寫,那么名稱與類名一樣,如 cn.felord.war.controller.IServiceImpl 為 IServiceImpl @Bean 標(biāo)識的 Bean 默認(rèn) 為方法名稱。 配置類相關(guān)注解 @Configuration 一般使用類全限定名。

但是請注意:如果你在聲明 Bean 的時候指定了名稱就只是你指定的名稱 。如果我們熟悉這些規(guī)則,使用上面提到的getBean(String name) 方法不失為一種好辦法。

2.3 通過類型來獲取 Bean

如果我們不清楚我們想要的特定類型 Bean 的名稱,我們可以根據(jù)類型來獲取 Bean 。ApplicationContext 提供了可以加載特定類型的 Bean 的所有 Bean 的方法getBeansOfType()。它將返回 Map <String,Object> 其中鍵是 Bean 名稱,而值是 Bean 的實際對象。

我們修改 2.1 章節(jié) 例子中的 run 方法:

@Override public void run(String... args) throws Exception { Map<String, FooController> beansOfType = applicationContext.getBeansOfType(FooController.class); beansOfType.forEach((beanName,bean)->{ System.out.println('beanName : ' + beanName); System.out.println('bean : ' + bean); }); }

再次運(yùn)行,控制臺打印出:

beanName : fooController bean : cn.felord.war.controller.FooController@545f80bf2.4 獲取特定 Bean 聲明注解標(biāo)記的 Bean

ApplicationContext 的 getBeansWithAnnotation() 方法可以讓我們獲取 @Service,@Controller或任何其它可以用來創(chuàng)建 Bean 的注解創(chuàng)建的 Bean

@Override public void run(String... args) throws Exception { Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(Controller.class); beansWithAnnotation.forEach((beanName,bean)->{ System.out.println('beanName : ' + beanName); System.out.println('bean : ' + bean); }); }

打印出:

beanName : fooController bean : cn.felord.war.controller.FooController@18ca3c62 beanName : basicErrorController bean : org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController@2c0f76783. 總結(jié)

在本文中,我們學(xué)習(xí)如何從 Spring 應(yīng)用上下文中獲取所有 Bean 的列表。有時我們需要檢查我們期望的 Bean 是否在 Spring 上下文中加載,或者我們需要檢查 Spring IoC 聲明的特定的 Bean 。當(dāng)然你可以開啟Spring Boot Actuator 的 beans 端點來獲取所有的 Bean 信息。

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Spring框架入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設(shè)計有所幫助。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产a视频| 亚洲精品99 | 日本精品一区二区 | 亚洲一区免费在线 | 国产精品久久久久久久午夜片 | 成人午夜免费视频 | 久久精品国产亚洲 | 久久久久久久久久久高潮一区二区 | 国产一区二 | 99免费在线观看 | 日韩成年人视频在线 | 国产精品视频免费观看 | 久久毛片 | 色婷婷久久久亚洲一区二区三区 | 国产精品久久久久久久免费大片 | a黄在线观看 | 一本一道久久a久久精品综合蜜臀 | 秋霞精品| 一级片免费网站 | 毛片一级片 | 久久国产综合 | 婷婷久久五月 | 91九色在线观看 | 狠狠综合久久av一区二区老牛 | 少妇无套高潮一二三区 | 欧美成人一区二区 | 久久中文字幕一区 | 日韩国产欧美一区 | 欧美成人自拍 | 99小视频 | 99免费 | 欧美无乱码久久久免费午夜一区 | 国产日韩欧美精品 | 欧美老妇交乱视频 | 翔田千里一区二区 | 久久久精品视 | 久久精品国产亚洲夜色av网站 | 欧美在线视频二区 | 毛片电影| 精品成人av| 草草视频在线播放 |