ApplicationContext
提供了获取所有已经成功注入 Spring IoC 容器的 Bean 名称的方法 getBeanDefinitionNames()
。然后我们可以借助于其 getBean(String name)
方法使用 Bean 名称获取特定的 Bean。 我们使用 CommandLineRunner
接口来打印一下结果。
1.1 获取所有的 Bean
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*/@SpringBootApplicationpublic class WarSpringBootApplication implements CommandLineRunner {@Autowiredprivate ApplicationContext applicationContext;public static void main(String[] args) {SpringApplication.run(WarSpringBootApplication.class, args);}@Overridepublic 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);});}}
1.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)
方法不失为一种好办法。
1.3 通过类型来获取 Bean
如果我们不清楚我们想要的特定类型 Bean 的名称,我们可以根据类型来获取 Bean 。ApplicationContext
提供了可以加载特定类型的 Bean 的所有 Bean 的方法getBeansOfType()
。它将返回 Map <String,Object>
其中键是 Bean 名称,而值是 Bean
的实际对象。
@Overridepublic 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);});}
1.4 获取特定 Bean 声明注解标记的 Bean
ApplicationContext
的 getBeansWithAnnotation()
方法可以让我们获取 @Service
,@Controller
或任何其它可以用来创建 Bean 的注解创建的 Bean 。
@Overridepublic 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);});}