知是行的主意,行是知的功夫。这篇文章主要讲述SpringBoot获取ApplicationContext,再获取bean的名称相关的知识,希望能为你提供帮助。
SpringBoot获取ApplicationContext,再获取bean的名称
前言有一天,我正在学SpringCloud,学到hystrix熔断器。
案例里面,教我们配置服务消费端的降级方法,此时我的idea在此处报了一个无关紧要的红线:
@Autowired
private UserFeignClient userFeignClient;
原因是现在有两个UserFeignClient的bean(一个是动态代理Feign客户端、另一个是服务降级类)
于是我就突发奇想,想用@Qualifier注解指定注入的bean,但是我不知道bean的名称,这怎么办呢?
SpringBoot获取ApplicationContext在百度后,我个人推荐如下方法:
启动类的SpringApplication.run方法的返回值是ConfigurableApplicationContext,这是ApplicationContext的一个子接口。
SpringApplication.run(UserConsumerApp.class, args);
因此,我们可以在启动类中用一个静态ApplicationContext变量来获取SpringApplication.run的返回值。例如:
package site.tcsn;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
@EnableFeignClients
public class UserConsumerApp {
public static ConfigurableApplicationContext applicationContext = null;
public static void main(String[] args) {
applicationContext = SpringApplication.run(UserConsumerApp.class, args);
//等到SpringBoot启动完成后才能调用该变量,否则此时applicationContext为null,被调用时会报空指针异常。
System.out.println("
SpringBoot启动完成,applicationContext:"
+applicationContext);
}}
这样,我们就能在其他类中调用启动类的applicationContext静态变量来获取ApplicationContext了。
- 要注意的是,用这种方法,必须等到SpringBoot启动完成后才能调用该变量,否则此时applicationContext为null,被调用时会报空指针异常。
applicationContext.getBeanNames*
方法即可。public void beanTest(){
/**
* 该方法用于查看类型为UserFeignClient.class的bean的名称
*UserConsumerApp.applicationContext是启动类中获取的ConfigurableApplicationContext
*/
ApplicationContext applicationContext = UserConsumerApp.applicationContext;
System.out.println(applicationContext);
String[] beanNamesForType = applicationContext.getBeanNamesForType(UserFeignClient.class);
System.out.println(Arrays.toString(beanNamesForType));
}
最后通过如上方式,我终于获得了bean的名称,并发现feign动态代理类的Bean名称是固定的。
【SpringBoot获取ApplicationContext,再获取bean的名称】可以开开心心的用@Qualifier注解指定注入的bean了!
@Autowired
@Qualifier("
site.tcsn.feign.UserFeignClient"
)
private UserFeignClient userFeignClient;
推荐阅读
- CSAPP
- IIS自带的http modules分别注册了HttpApplication pipeline里面的哪些事件
- android studio 如何升级sdk
- AndroidStudio 插件记录
- ANdroid Studio下载
- appium——微信小程序自动化
- appium-Hybird应用自动化
- [nowcoder5667H]Happy Triangle
- Android使用selector切换enable状态遇到的问题(只改变了颜色但是没改变形状)