从Spring 应用上下文获取 Bean

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
  */
 @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);
         });
 
     }
 }

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  其中键是 Bean 名称,而值是 Bean 的实际对象。

     @Override
     public void run(String... args) throws Exception {
         Map 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 。

     @Override
     public void run(String... args) throws Exception {
         Map beansWithAnnotation = applicationContext.getBeansWithAnnotation(Controller.class);
 
         beansWithAnnotation.forEach((beanName,bean)->{
             System.out.println("beanName : " + beanName);
             System.out.println("bean : " + bean);
         });
     }

你可能感兴趣的:(spring,java)