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

創(chuàng)新互聯(lián)專注于企業(yè)網絡營銷推廣、網站重做改版、南川網站定制設計、自適應品牌網站建設、H5建站、商城開發(fā)、集團公司官網建設、外貿網站建設、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為南川等各大城市提供網站開發(fā)制作服務。
1. 前言
通常,在Spring應用程序中,當我們使用 @Bean,@Service,@Controller,@Configuration 或者其它特定的注解將 Bean注入 Spring IoC。然后我們可以使用 Spring框架提供的 @Autowired 或者 JSR250、JSR330規(guī)范注解來使用由 Spring IoC管理的 Bean。
今天我們將來學習如何從 ApplicationContext 中獲取 Bean。因為有些情況下我們不得不從應用程序上下文中來獲取 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...>
從上面打印的信息我們也能看出來一些端倪。
beanName 是類全限定名。@Component、@Repository、@Service、@Controller等注解創(chuàng)建 Bean時,如果不指定bean名稱,名稱的默認規(guī)則是類名的首字母小寫,如 cn.felord.war.controller.FooController 為 fooController。如果類名前兩個或以上個字母都是大寫,那么名稱與類名一樣,如 cn.felord.war.controller.IServiceImpl 為 IServiceImpl@Bean 標識的 Bean 默認為方法名稱。@Configuration 一般使用類全限定名。但是請注意:如果你在聲明 Bean 的時候指定了名稱就只是你指定的名稱。如果我們熟悉這些規(guī)則,使用上面提到的getBean(String name) 方法不失為一種好辦法。
如果我們不清楚我們想要的特定類型 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);
});
}再次運行,控制臺打印出:
beanName : fooController bean : cn.felord.war.controller.FooController@545f80bf
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@2c0f7678
在本文中,我們學習如何從 Spring應用上下文中獲取所有 Bean的列表。有時我們需要檢查我們期望的 Bean是否在 Spring上下文中加載,或者我們需要檢查 Spring IoC聲明的特定的 Bean。當然你可以開啟Spring Boot Actuator 的 beans 端點來獲取所有的 Bean信息。
看完這篇關于Spring如何應用上下文獲取Bean的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
當前題目:Spring如何應用上下文獲取Bean
本文鏈接:http://chinadenli.net/article6/jhgeig.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網站設計、靜態(tài)網站、建站公司、營銷型網站建設、域名注冊
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)