Общие жесты для получения bean-компонентов из контекста приложения Spring

Spring Boot

1. Введение

Обычно в приложении Spring, когда мы используем@Bean,@Service,@Controller,@Configurationили другие специальные аннотации будутBeanинъекцияSpring IoC. Тогда мы можем использоватьSpringпредоставлено структурой@AutowiredилиJSR250,JSR330Каноническая аннотация для использованияSpring IoCудалосьBean.

2. Получить bean-компонент из контекста приложения

Сегодня мы научимся делатьApplicationContextполучено вBean. Потому что в некоторых случаях мы должны получить его из контекста приложения.Bean.

2.1 Получить все бобы

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...>

2.2 Получить конкретный компонент по имени

Мы также можем увидеть некоторые подсказки из информации, напечатанной выше.

  • немногоbeanNameявляется полным именем класса.
  • @Component,@Repository,@Service,@Controllerдождитесь создания аннотацииBeanЕсли имя компонента не указано, правилом по умолчанию для имени является первая буква имени класса в нижнем регистре, напримерcn.felord.war.controller.FooControllerзаfooController. Если первые две или более буквы имени класса написаны заглавными, то имя совпадает с именем класса, как вcn.felord.war.controller.IServiceImplзаIServiceImpl
  • @BeanидентифицированныйБин по умолчаниюэто имя метода.
  • Примечания, связанные с классом конфигурации@ConfigurationОбычно используйте полное имя класса.

Но обратите внимание:Если вы указываете имя при объявлении bean-компонента, это просто имя, которое вы указываете. Если мы знакомы с этими правилами, используйте вышеупомянутыеgetBean(String name)метод хороший способ.

2.3 Получение бобов по типу

Если мы не знаем конкретный тип, который нам нуженBeanимя, мы можем получить его в соответствии с типомBean.ApplicationContextпредоставляет возможность загружать определенные типыBeanвсеBeanМетодыgetBeansOfType(). он вернетсяMap где ключ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@545f80bf

2.4 Получить Bean, помеченный определенной аннотацией объявления Bean

ApplicationContextиз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

3. Резюме

В этой статье мы узнаем, какSpringПолучить все в контексте приложенияBeanСписок. Иногда нам нужно проверить, что мы ожидаемBeanВы вSpringконтекст загружен, или нам нужно проверитьSpring IoCобъявлен специфичнымBean. конечно можно включитьSpring Boot Actuatorизbeansконечная точка, чтобы получить всеBeanИнформация.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn