java线程中如何使用spring依赖注入
实现一个线程继承了Thread或实现Runnable接口,想在run方法中使用spring依赖注入(操作数据库),此时报错为空指针,就是说没有注入进来。
实验了几种方式,分别说一下优缺点。
1:写了工具类,实现ApplicationContextAware接口,做一个通过name获取实例的方式,代码如下:

1 public class SpringUtil implements ApplicationContextAware { 2 3 private static ApplicationContext ctx = null; 4 5 @Override 6 public void setApplicationContext(ApplicationContext applicationContext) 7 throws BeansException { 8 9 if (SpringUtil.ctx == null) { 10 SpringUtil.ctx = applicationContext; 11 } 12 } 13 14 public static ApplicationContext getCtx() { 15 return ctx; 16 } 17 18 public static Object getBean(String name) { 19 return getCtx().getBean(name); 20 } 21 22 23 }
这种方式有个缺陷,需要web容器相应之后才有值,也就说是懒加载了,线程如果比web容器先响应的时候还是为null值。
2:内部类,这个不多说了,实际上属于绕过去了,我自己认为这样写破坏了结构,也不好维护。
3:构造注入,我认为这个方式最好,注入类依旧被spring管理,代码结构简单清晰。
在线程中提供一个构造方法,比如(注意:public RecvThread(boolean flag, DBmapper dbMapper) ):

1 @Component("RecvThread") 2 public class RecvThread extends Observable implements Runnable { 3 4 private boolean flag; 5 6 private DBmapper dbMapper; 7 8 private QueueModel model; 9 10 private static HashMap<String, String> map = new HashMap<String, String>(); 11 12 public RecvThread() { 13 super(); 14 } 15 16 public RecvThread(boolean flag, DBmapper dbMapper) { 17 this.flag = flag; 18 this.dbMapper = dbMapper; 19 } 20 21 public void ob(){ 22 if(true){ 23 super.setChanged(); 24 } 25 notifyObservers(); 26 } 27 28 @Override 29 public void run() { 30 while (flag) { 31 try {
在启动线程的地方注入:

1 @Component("SystemStartBean") 2 public class SystemStartBean extends SpringBeanAutowiringSupport implements Servlet { 3 4 @Autowired 5 private DBmapper dbMapper; 6 7 @Override 8 public void init(ServletConfig arg0) throws ServletException { 9 10 RecvThread rt = new RecvThread(true, dbMapper); 11 rt.addObserver(new RecvThreadListener()); 12 new Thread(rt).start(); 13 }
分类:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?