时间:2021-05-19
本文实例讲述了Spring 应用上下文获取 Bean 的常用姿势。分享给大家供大家参考,具体如下:
通常,在Spring应用程序中,当我们使用 @Bean,@Service,@Controller,@Configuration 或者其它特定的注解将 Bean注入Spring IoC。然后我们可以使用Spring 框架提供的 @Autowired 或者 JSR250、JSR330规范注解来使用由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...>从上面打印的信息我们也能看出来一些端倪。
但是请注意:如果你在声明 Bean 的时候指定了名称就只是你指定的名称 。如果我们熟悉这些规则,使用上面提到的getBean(String name) 方法不失为一种好办法。
如果我们不清楚我们想要的特定类型Bean的名称,我们可以根据类型来获取Bean 。ApplicationContext 提供了可以加载特定类型的 Bean的所有Bean 的方法getBeansOfType()。它将返回 Map <String,Object> 其中键是 Bean 名称,而值是 Bean 的实际对象。
我们修改2.1 章节 例子中的 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@545f80bfApplicationContext 的 getBeansWithAnnotation() 方法可以让我们获取 @Service,@Controller或任何其它可以用来创建 Bean的注解创建的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信息。
更多关于java相关内容感兴趣的读者可查看本站专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Spring从两个角度来实现自动化装配:组件扫描:Spring会自动发现应用上下文中所创建的bean。自动装配:Spring自动满足bean之间的依赖。案例:音
前言SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中
关于延迟加载在Spring中,默认情况下所有定的bean及其依赖项目都是在应用启动时创建容器上下文是被初始化的。测试代码如下:@Slf4j@Configurat
执行上下文(Executioncontext)执行上下文(简称上下文)决定了Js执行过程中可以获取哪些变量、函数、数据,一段程序可能被分割成许多不同的上下文,每
js获取当前web应用的上下文路径实现方法//jswebcontextvarwebroot=document.location.href;webroot=web