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获取更多资讯