当前位置:   article > 正文

Spring Boot————静态方法如何调用Spring容器中的Bean_springboot 静态方法中适用spring注入的对象

springboot 静态方法中适用spring注入的对象

问题分析

在使用静态方法的时候,某些情况下,需要使用类似自动注入的Bean来实现某些业务逻辑。

一般的非静态方法,可以很容易的通过在方法所在的类中@Autowired自动将依赖的Bean注入到本类中,并操作。

静态方法在使用同样的操作流程时,由于静态调用的约束,需要在@Autowired注入时,将Bean对象设置为是static。然而在调用时却发生“空指针”异常。代码如下:

Service类:

调用类:

为什么会出现这种情况?原因是Spring容器的依赖注入是依赖set方法,而set方法是实例对象的方法,而静态变量属于类,因此注入依赖时无法注入静态成员变量,在调用的时候依赖的Bean才会为null。

解决方案

spring容器注入静态变量的方法并不唯一,但是springboot对spring容器有一定的托管处理,很多配置属于默认最优配置,因此,在springboot中,此问题最简单的解决方案就是通过getBean的方式。

总体思路是:在springboot的启动类中,定义static变量ApplicationContext,利用容器的getBean方法获得依赖对象。

  1. package com.mht;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.context.ConfigurableApplicationContext;
  7. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  8. @SpringBootApplication
  9. @EnableJpaRepositories
  10. public class Start {
  11. private static Logger logger = LoggerFactory.getLogger(Start.class);
  12. public static ConfigurableApplicationContext ac;
  13. public static void main(String[] args) {
  14. Start.ac = SpringApplication.run(Start.class, args);
  15. logger.info("-----------------------启动完毕-------------------------");
  16. }
  17. }

修改调用方式:

  1. package com.mht.utils;
  2. import com.mht.Start;
  3. import com.mht.service.SimpleService;
  4. public class Utility {
  5. public static void callService() {
  6. Start.ac.getBean(SimpleService.class).testSimpleBeanFactory();
  7. }
  8. }

测试:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/798462
推荐阅读
相关标签
  

闽ICP备14008679号