真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Spring如何應(yīng)用上下文獲取Bean

小編這次要給大家分享的是Spring如何應(yīng)用上下文獲取Bean,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、南川網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站商城開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為南川等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

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àn)橛行┣闆r下我們不得不從應(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)用會(huì)輸出:

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
 

2.2 通過名稱獲取特定的 Bean

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

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

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

2.3 通過類型來獲取 Bean

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

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

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

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

beanName : fooController
 bean : cn.felord.war.controller.FooController@545f80bf

2.4 獲取特定 Bean 聲明注解標(biāo)記的 Bean

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

   @Override
   public void run(String... args) throws Exception {
     Map 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@2c0f7678

3. 總結(jié)

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

看完這篇關(guān)于Spring如何應(yīng)用上下文獲取Bean的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。


名稱欄目:Spring如何應(yīng)用上下文獲取Bean
網(wǎng)頁路徑:http://weahome.cn/article/jhgeig.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部