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);});}