首页 > 其他分享 >@Autowired 注入为null

@Autowired 注入为null

时间:2023-11-17 09:00:26浏览次数:50  
标签:applicationContext service Autowired getBean 线程 null BeanUtils 注入

  1.  背景

  写一个SpringBoot程序,把从接口传过来的数据放进队列,用线程将数据读进数据库和redis。在启动类创建了一个全局队列,通过实现runable接口的方式写了一个线程A,在线程中用@Autowird 注入 service层的对象调用操作数据库的办法。原本打算在启动类通过 new Thread( new A())起一个线程,调试的时候发现线程A中注入的service为null。

   2. 出现问题

  线程A中注入的service为null,导致数据没有写到数据库和redis。

   3. 出现原因

   经过请教同事,知道了new 出来的实例不会交给Spring容器管理,所以实例里面的 service或者dao注入不进来。

   4. 解决办法

  自己写了一个工具类BeanUtils实现不通过new 也能拿到实例,在启动类通过工具管理类getBean拿到实例 起一个线程,解决啦!!!

   5.代码

BeanUtils 工具类的代码如下:
package com.ws.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class BeanUtils implements ApplicationContextAware  {
    protected static ApplicationContext applicationContext ;

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

    }
    public static Object getBean(String name) {
        //name表示其他要注入的注解name名
        return applicationContext.getBean(name);
    }

    /**
     * 拿到ApplicationContext对象实例后就可以手动获取Bean的注入实例对象
     */
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
}

  启动类:

Intersms_userThread intersms_userthread = BeanUtils.getBean(Intersms_userThread.class);

// 通过BeanUtils.getBean的方式拿到intersms_userthread的实例,这样就可以在intersms_userthread中使用@Autowired 注入service了
Thread IntersmsSaveThread = new Thread(intersms_userthread);
IntersmsSaveThread.start();

   6. 待解决

  通过上述步骤,@Autowired 注入为null的问题就解决了,下面是我在实践中遇到的问题,后期不断学习回来继续补充:

  我尝试在Intersms_userThread.java 这个类里面通过

IntersmsService service = BeanUtils.getBean(IntersmsService .class);

  引入service,但是在getBean里面applicationContext为null

  

标签:applicationContext,service,Autowired,getBean,线程,null,BeanUtils,注入
From: https://www.cnblogs.com/sheep-see/p/17836769.html

相关文章

  • 非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)
    题目环境:<br/>没错,又是我,这群该死的黑客竟然如此厉害,所以我回去爆肝SQL注入,这次,再也没有人能拿到我的flag了做了好多这个作者出的题了,看来又要上强度了判断注入类型username:adminpassword:1这里把参数password作为注入点<br/>1'<br/>单引号的字符型注入万能密码注......
  • C++调用Python3实战,和PyImport_ImportModule返回NULL问题解决
    LinuxC++调用Python3入门准备以下面的目录结构演示如何在LinuxC/C++调用python3。|--hello.py|--main.cpp|--CMakeLists.txt hello.py:python的脚本,里面有2个函数main.cpp:c++函数CMakeLists.txt:Cmake文件,生成makefilepython脚本示例python脚本hello.py内容如下,......
  • Angular 依赖注入系统里 Injection token APP_BASE_HREF 的使用场景
    Angular的依赖注入系统是其核心功能之一,它提供了一种优雅的方式来管理应用中的服务和组件之间的依赖关系。在Angular中,我们可以使用各种方式来提供依赖项,而APP_BASE_HREF是其中的一个依赖注入标记。APP_BASE_HREF是一个Injectiontoken,它在Angular的路由系统中扮演了重......
  • 在C#语言里对NULL的简化赋值
     1、NULL合并操作符(??)null合并操作符(??)是一个简写操作符,用于在左侧对象不为null时返回左侧值,在左侧对象为null时返回右侧值。当您在判断当前对象值是否null值并且赋值新对象需要简写时,此操作符非常有用。stringname=null;stringresult=name??"Unknown";Console.......
  • Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象
    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】第七章、反转控制与依赖注入1.反转(转移)控制(IOCinverseofControl)控制:对于成员变量赋值的控制权反转控制:把对于成员变量赋值的控制权,从代码......
  • 【随手记】解析 JSON 中的 Null 值遇到的问题
    在Java中解析JSON字符串时,不同的库会对JSON中的null值有不同的处理方式。本文探讨阿里巴巴的JSONObject和net.sf.json.JSONObject在处理null值时的差异。阿里巴巴的JSONObject阿里巴巴的JSONObject.parseObject方法,在解析JSON字符串时,会将JSON中的null......
  • .NET8依赖注入新特性Keyed services
    什么是KeyedserviceKeyedservice是指,为一个需要注入的服务定义一个KeyName,并使用使用KeyName检索依赖项注入(DI)服务的机制。使用方法通过调用AddKeyedSingleton(或AddKeyedScoped或AddKeyedTransient)来注册服务,与KeyName相关联。或使用[FromKeyedServices]属性指......
  • 在 Angular 中,Controller 之间通信的方式主要有三种:作用域继承仅限于上下级之间的通信
    AngularJS中control间通信最好使用什么方式?A回调B全局变量C广播D函数调用正确答案:C在Angular中,Controller之间通信的方式主要有三种:1)作用域继承。利用子Controller控制父Controller上的数据。2)注入服务。把需要共享的数据注册为一个service,在需要的Controlle......
  • Spring5学习随笔-Set注入详解和构造注入
    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】第四章、注入(Injection)1.什么是注入通过Spring工厂及配置文件,为所创建对象的成员变量赋值1.1为什么需要注入“通过编码的方式,为成员遍历进行赋值,......
  • mybatisPlus进行修改某字段为null时
    在相关字段上加上注解@TableField(strategy=FieldStrategy.IGNORED)如:@TableField(updateStrategy=FieldStrategy.IGNORED)@ApiModelProperty(value="检验结果2:1返工/返修、2整改、3报废")privateIntegerinspResult2; ......