想要获取容器中的信息,首先需要拿到 ApplicationContext 实例,
获取 ApplicationContext 实例的方法一般有两种,
一是,启动时接收返回的ApplicationContext 实例,并保存到某个公共变量上。
二是,实现 ApplicationContextAware 接口。
方法一:
Spring Boot 入口类 MyApplication
Java代码
- @SpringBootApplication
- @ServletComponentScan
- public class MyApplication {
- private static Logger log = LoggerFactory.getLogger(IotHubApplication.class);
- private static ApplicationContext applicationContext;
- public static ApplicationContext getApplicationContext(){
- return applicationContext;
- }
- public static void main(String[] args) {
- applicationContext = SpringApplication.run(IotHubApplication.class, args);
- }
- }
方法二:
自定义工具类 SpringUtil,实现 ApplicationContextAware 接口。
Java代码
- import org.springframework.beans.BeansException;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.ApplicationContextAware;
- import org.springframework.stereotype.Component;
- //加入@Component注解,让spring扫描到该bean
- @Component
- public class SpringUtil implements ApplicationContextAware {
- private static ApplicationContext applicationContext;
- @Override
- public void setApplicationContext(ApplicationContext applicationContext)
- throws BeansException {
- if (SpringUtil.applicationContext == null) {
- SpringUtil.applicationContext = applicationContext;
- }
- }
- // 获取applicationContext
- public static ApplicationContext getApplicationContext() {
- return applicationContext;
- }
- //通过name获取 Bean.
- public static Object getBean(String name){
- return getApplicationContext().getBean(name);
- }
- //通过class获取Bean.
- public static <T> T getBean(Class<T> clazz){
- return getApplicationContext().getBean(clazz);
- }
- //通过name,以及Clazz返回指定的Bean
- public static <T> T getBean(String name,Class<T> clazz){
- return getApplicationContext().getBean(name, clazz);
- }
- }
关于注解@Component的说明:
1、@Component泛指各种组件,就是说当我们的类不属于 @Controller、@Service、@repository等的时候,我们就可以使用@Component来标注这个类。
2、被 @controller 、@service、@repository 、@component 注解的类,都会纳入spring容器中进行管理 。
关于ApplicationContextAware接口的说明:
Spring容器会检测容器中的所有Bean,
如果发现某个Bean实现了ApplicationContextAware接口,
Spring容器会在创建该Bean之后,
自动调用该bean的setApplicationContext(ApplicationContext applicationContext)方法,
调用该方法时,会将容器本身作为参数传给该方法。
SpringUtil使用示例
Java代码
- // 容器中的bean总数
- System.out.println(SpringUtil.getApplicationContext()
- .getBeanDefinitionCount());
- // 取得容器中的所有beanName,并打印包含keycloak关键词的
- String beanNames[] = SpringUtil.getApplicationContext()
- .getBeanDefinitionNames();
- for (String beanName : beanNames) {
- if (beanName.contains("keycloak") || beanName.contains("Keycloak")) {
- System.out.println(beanName);
- }
- }
- // 获取 HelloController 实例
- HelloController helloController = SpringUtil.getApplicationContext()
- .getBean(HelloController.class);
- System.out.println(helloController.hello("huangqiqing", null));
上面示例输出结果:
515
keycloakClientRequestFactoryProd
keycloakClientRequestFactory
keycloakRestTemplate
KeycloakConfigResolver
keycloakAuthenticationProcessingFilterRegistrationBean
keycloakPreAuthActionsFilterRegistrationBean
keycloakAuthenticationProcessingFilter
keycloakPreAuthActionsFilter
keycloakAuthenticatedActionsFilter
keycloakSecurityContextRequestFilter
org.keycloak.adapters.springboot.KeycloakAutoConfiguration
getKeycloakContainerCustomizer
tomcatKeycloakContextCustomizer
keycloak-org.keycloak.adapters.springboot.KeycloakSpringBootProperties
Hello World huangqiqing