bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

Spring如何應用上下文獲取Bean

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

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

1. 前言

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

2. 從應用程序上下文中獲取 Bean

今天我們將來學習如何從 ApplicationContext 中獲取 Bean。因為有些情況下我們不得不從應用程序上下文中來獲取 Bean

2.1 獲取所有的 Bean

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

 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);
     });
 
   }
 }

運行應用會輸出:

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名稱,名稱的默認規(guī)則是類名的首字母小寫,如 cn.felord.war.controller.FooControllerfooController。如果類名前兩個或以上個字母都是大寫,那么名稱與類名一樣,如 cn.felord.war.controller.IServiceImplIServiceImpl
  • @Bean 標識的 Bean 默認為方法名稱。
  • 配置類相關注解 @Configuration 一般使用類全限定名。

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

2.3 通過類型來獲取 Bean

如果我們不清楚我們想要的特定類型 Bean的名稱,我們可以根據類型來獲取 BeanApplicationContext 提供了可以加載特定類型的 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);
     });
   }

再次運行,控制臺打印出:

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

2.4 獲取特定 Bean 聲明注解標記的 Bean

ApplicationContextgetBeansWithAnnotation() 方法可以讓我們獲取 @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@2c0f7678

3. 總結

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

看完這篇關于Spring如何應用上下文獲取Bean的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

當前題目:Spring如何應用上下文獲取Bean
本文鏈接:http://vcdvsql.cn/article6/jhgeig.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化網站設計靜態(tài)網站建站公司營銷型網站建設域名注冊

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網站托管運營