Spring Boot 普通类调用Bean对象的一种方式

有时我们有一些特殊的需要,可能要在一个不被Spring管理的普通类中去调用Spring管理的bean对象的一些方法,比如一般SpringMVC工程在controller中通过

@Autowired
private TestService testService;

注入TestService 接口就可以调用此接口实现类的实现的方法。
但在一般类中显然不可以这么做,注入的 TestService 将会报空指针异常,你无法拿到这个bean,在一般的ssm工程中我们可以通过xml配置把普通类设置成一个bean对象,那么 TestService 就有效了, 或者使用 ApplicationContext 直接读取xml配置中的bean也可以拿到 TestService。`

Spring Boot 已经摒弃了各种繁琐的xml配置,当然就不再使用xml配置的方式,之前在网上看到一种很简便的方式,但现在又找不到链接了,这里做下记录。

在普通类中定义 ApplicationContext 静态变量和set方法

    private static ApplicationContext applicationContext;//启动类set入,调用下面set方法

    public static void setApplicationContext(ApplicationContext context) {
        applicationContext = context;
    }

在启动类中,启动时事实已经生成 ConfigurableApplicationContext 对象, ConfigurableApplicationContext 是 ApplicationContext 接口的实现,这里直接传到普通类的 setApplicationContext 方法就行了

@SpringBootApplication
@ServletComponentScan
public class WxApplication implements EmbeddedServletContainerCustomizer{

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(WxApplication.class, args);
        TestClass.setApplicationContext(applicationContext);
    }
}

由于是静态变量,类加载时 applicationContext 已经存在,就可获取到 TestService 了,唯一不好就是静态变量在服务器启动后将一直存在

public class TestClass {

    private static ApplicationContext applicationContext;//启动类set入,调用下面set方法

    public static void setApplicationContext(ApplicationContext context) {
        // TODO Auto-generated method stub
        applicationContext = context;
    }

    public void getBeanTest(){
        TestService testService  = (TestService)applicationContext.getBean(TestService.class);
    }
}

补充
在普通 Spring 工程在启动的时候都会通过 org.springframework.web.context.ContextLoaderListener 监听器从加载系统资源并管理bean, Spring 提供的 WebApplicationContextUtils 工具类能在请求时获取到运行时工程的bean,如果看源码就可以知道监听器执行时与 WebApplicationContextUtils 类的关联

//封装一下,类的class和请求request为必要参数
public static <T> T getBean(Class<? extends Object> cla,HttpServletRequest request){
        if(request == null){
            return null;
        }
        return (T)WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext()).getBean(cla);//getBean参数可为bean类的.class或直接是bean的Id
    }

//这样获取bean
TestService testService= (TestService)getBean(TestService.class, request);
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值