Spring如何应用上下文获取Bean
小编这次要给大家分享的是Spring如何应用上下文获取Bean,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。
创新互联专注于企业网络营销推广、网站重做改版、南川网站定制设计、自适应品牌网站建设、H5建站、商城开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为南川等各大城市提供网站开发制作服务。
1. 前言
通常,在Spring应用程序中,当我们使用 @Bean
,@Service
,@Controller
,@Configuration
或者其它特定的注解将 Bean注入 Spring IoC。然后我们可以使用 Spring框架提供的 @Autowired
或者 JSR250、JSR330规范注解来使用由 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
2.2 通过名称获取特定的 Bean
从上面打印的信息我们也能看出来一些端倪。
- 有的
beanName
是类全限定名。 @Component
、@Repository
、@Service
、@Controller
等注解创建 Bean时,如果不指定bean名称,名称的默认规则是类名的首字母小写,如cn.felord.war.controller.FooController
为fooController
。如果类名前两个或以上个字母都是大写,那么名称与类名一样,如cn.felord.war.controller.IServiceImpl
为IServiceImpl
@Bean
标识的 Bean 默认为方法名称。- 配置类相关注解
@Configuration
一般使用类全限定名。
但是请注意:如果你在声明 Bean 的时候指定了名称就只是你指定的名称。如果我们熟悉这些规则,使用上面提到的getBean(String name)
方法不失为一种好办法。
2.3 通过类型来获取 Bean
如果我们不清楚我们想要的特定类型 Bean的名称,我们可以根据类型来获取 Bean。ApplicationContext
提供了可以加载特定类型的 Bean的所有 Bean的方法getBeansOfType()
。它将返回 Map
其中键是 Bean名称,而值是 Bean
的实际对象。
我们修改 2.1 章节例子中的 run
方法:
@Override public void run(String... args) throws Exception { MapbeansOfType = 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
ApplicationContext
的 getBeansWithAnnotation()
方法可以让我们获取 @Service
,@Controller
或任何其它可以用来创建 Bean的注解创建的 Bean。
@Override public void run(String... args) throws Exception { MapbeansWithAnnotation = 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://scyanting.com/article/jhgeig.html