Spring 应用上下文获取 Bean 的常用姿势实例总结
本文实例讲述了Spring应用上下文获取Bean的常用姿势。分享给大家供大家参考,具体如下:
1.前言
通常,在Spring应用程序中,当我们使用@Bean,@Service,@Controller,@Configuration或者其它特定的注解将Bean注入SpringIoC。然后我们可以使用Spring框架提供的@Autowired或者JSR250、JSR330规范注解来使用由SpringIoC管理的Bean。
2.从应用程序上下文中获取Bean
今天我们将来学习如何从ApplicationContext中获取Bean。因为有些情况下我们不得不从应用程序上下文中来获取Bean。
2.1获取所有的Bean
ApplicationContext提供了获取所有已经成功注入SpringIoC容器的Bean名称的方法getBeanDefinitionNames()。然后我们可以借助于其getBean(Stringname)方法使用Bean名称获取特定的Bean。我们使用之前文章中介绍的CommandLineRunner接口来打印一下结果。
importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.boot.CommandLineRunner; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; importorg.springframework.context.ApplicationContext; importjava.util.stream.Stream; /** *@authorFelordcn */ @SpringBootApplication publicclassWarSpringBootApplicationimplementsCommandLineRunner{ @Autowired privateApplicationContextapplicationContext; publicstaticvoidmain(String[]args){ SpringApplication.run(WarSpringBootApplication.class,args); } @Override publicvoidrun(String...args)throwsException{ String[]beanDefinitionNames=applicationContext.getBeanDefinitionNames(); Stream.of(beanDefinitionNames).forEach(beanName->{ System.out.println("beanName:"+beanName); Objectbean=applicationContext.getBean(beanName); System.out.println("Springbean:"+bean); }); } }
运行应用会输出:
2019-11-0522:15:54.392INFO6356---[main]cn.felord.war.WarSpringBootApplication:StartedWarSpringBootApplicationin4.663seconds(JVMrunningfor7.58) beanName:org.springframework.context.annotation.internalConfigurationAnnotationProcessor Springbean:org.springframework.context.annotation.ConfigurationClassPostProcessor@6c44052e beanName:org.springframework.context.annotation.internalAutowiredAnnotationProcessor Springbean:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor@5c371e13 beanName:org.springframework.context.annotation.internalCommonAnnotationProcessor Springbean:org.springframework.context.annotation.CommonAnnotationBeanPostProcessor@530a8454 beanName:org.springframework.context.event.internalEventListenerProcessor Springbean:org.springframework.context.event.EventListenerMethodProcessor@1e34c607 beanName:org.springframework.context.event.internalEventListenerFactory Springbean:org.springframework.context.event.DefaultEventListenerFactory@5215cd9a beanName:fooController Springbean:cn.felord.war.controller.FooController@31198ceb beanName:IServiceImpl Springbean: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(Stringname)方法不失为一种好办法。
2.3通过类型来获取Bean
如果我们不清楚我们想要的特定类型Bean的名称,我们可以根据类型来获取Bean。ApplicationContext提供了可以加载特定类型的Bean的所有Bean的方法getBeansOfType()。它将返回Map
我们修改2.1章节例子中的run方法:
@Override publicvoidrun(String...args)throwsException{ 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 publicvoidrun(String...args)throwsException{ 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上下文中加载,或者我们需要检查SpringIoC声明的特定的Bean。当然你可以开启SpringBootActuator的beans端点来获取所有的Bean信息。
更多关于java相关内容感兴趣的读者可查看本站专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。