Spring实战-遇到的问题记录系列--@Autowired注入为空

文章目录

    • Springboot中new出来的实例中含有@Autowired注入时的Spring Bean为NULL
      • 原因分析
      • 代码实现参考

Springboot中new出来的实例中含有@Autowired注入时的Spring Bean为NULL

Springboot中new出来的实例中含有@Autowired注入时的Spring Bean为NULL
https://blog.csdn.net/Mr_Runner/article/details/83684088

原因分析

new出来的实例中含有@Autowired注入时,注入的Bean为null;

@Autowired注入时是将类交给Springboot管理,而new出来的实例脱离了Springboot的管理,两个东西不在一个管理者管理下,所以没法联系在一起,@Autowired注入就会为null。
解决方法:
不要用new的方式实例化,也采用注解的方式,在需要new的实例类上加@Component注解,通过注入的方式使用实例化类;

代码实现参考

springboot中通过main方法调用service,daohttps://blog.csdn.net/qq_25925973/article/details/90751870

大多数情况下,我们使用springboot是创建一个web项目,然后通过接口访问,但是也有特殊情况,比如线上跑着的web项目,有一些特殊的数据,需要经过计算导入到数据库,这个时候,我们可能需要原来的web项目中的一些service,dao才辅助操作,但是又不能在服务端新开接口。我们通过springboot的main方法执行这些操作。

此时,service和到需要通过上下文获得。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
 
 
/**
 * 普通类调用Spring bean对象:
 * 注意:此类需要放到App.java同包或者子包下才能被扫描,否则失效。
 */
 
@Component
public class SpringUtil implements ApplicationContextAware{
 
    private static ApplicationContext applicationContext = null;
     @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
       if(SpringUtil.applicationContext == null){
           SpringUtil.applicationContext  = applicationContext;
       }
      
    }
     //获取applicationContext
    public static ApplicationContext getApplicationContext() {
       return applicationContext;
    }
     //通过name获取 Bean.
    publicstatic 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);
    }
}

在主方法中:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class RabbitmqproviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(RabbitmqproviderApplication.class, args);

        ApplicationContext context = SpringUtil.getApplicationContext();
        SendMessageService  service = context.getBean(SendMessageService.class);
        service.sendDirectMessage();
    }
}

你可能感兴趣的:(#)