关于工具类静态方法调用service类注入的问题解决

 方案一:

//1 重点一:要加component注解
@Component
public class ServiceUtil {
    @Autowired
    private YourService yourService;

    //2 重点二:建一个静态的本类
   private static ServiceUtil serviceUtil;

    //3 重点三:初始化
    @PostConstruct
    public void init() {
        serviceUtil = this;
        serviceUtil.yourService = this.yourService;
    }

    public static void update(Object object) {
        //4 重点四:service的调用
        serviceUtil.yourService.update(object);
    }
}

注释:

(1)处作用是将(3)serviceUtil = this;this进行赋值(注:如果无注解serviceUtil 将null)

(2)处为spring自动注入,使用spring框架的很常用,但是如果在静态方法中调用此注入类的方法,发现注入为'null';原因不是spring未注入,而是被static方法给'清空'了,在无法先于static方法初始化之前想了一个办法

(3)处为想到的办法:通过(注:@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行)的方法public void init()先给该类赋值,然后通过(2)处注入进来。这样不影响service下面调用的注入!

(4)处是使用这样模式的调用方式yourService现在是作为serviceUtil的属性

 

 

 

方案二:

@Component
public class SpringBootBeanUtil  implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringBootBeanUtil.applicationContext == null) {
            SpringBootBeanUtil.applicationContext = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext(){
        return applicationContext;
    }

    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }


    public static  T getBean(Class clazz) {
        return applicationContext.getBean(clazz);
    }
}

直接获取Service的bean然后进行调用即可

BusinessService businessService = SpringBootBeanUtil.getBean(BusinessService.class); 

businessService.doSomething();

 

你可能感兴趣的:(springboot)