首页 技术 正文
技术 2022年11月11日
0 收藏 974 点赞 2,188 浏览 1489 个字

实现一个线程继承了Thread或实现Runnable接口,想在run方法中使用spring依赖注入(操作数据库),此时报错为空指针,就是说没有注入进来。

实验了几种方式,分别说一下优缺点。

1:写了工具类,实现ApplicationContextAware接口,做一个通过name获取实例的方式,代码如下:

 public class SpringUtil implements ApplicationContextAware {     private static ApplicationContext ctx = null;     @Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException { if (SpringUtil.ctx == null) {
SpringUtil.ctx = applicationContext;
}
} public static ApplicationContext getCtx() {
return ctx;
} public static Object getBean(String name) {
return getCtx().getBean(name);
} }

这种方式有个缺陷,需要web容器相应之后才有值,也就说是懒加载了,线程如果比web容器先响应的时候还是为null值。

2:内部类,这个不多说了,实际上属于绕过去了,我自己认为这样写破坏了结构,也不好维护。

3:构造注入,我认为这个方式最好,注入类依旧被spring管理,代码结构简单清晰。

在线程中提供一个构造方法,比如(注意:public RecvThread(boolean flag, DBmapper dbMapper) ):

 @Component("RecvThread")
public class RecvThread extends Observable implements Runnable { private boolean flag; private DBmapper dbMapper; private QueueModel model; private static HashMap<String, String> map = new HashMap<String, String>(); public RecvThread() {
super();
} public RecvThread(boolean flag, DBmapper dbMapper) {
this.flag = flag;
this.dbMapper = dbMapper;
} public void ob(){
if(true){
super.setChanged();
}
notifyObservers();
} @Override
public void run() {
while (flag) {
try {

在启动线程的地方注入:

 @Component("SystemStartBean")
public class SystemStartBean extends SpringBeanAutowiringSupport implements Servlet { @Autowired
private DBmapper dbMapper; @Override
public void init(ServletConfig arg0) throws ServletException { RecvThread rt = new RecvThread(true, dbMapper);
rt.addObserver(new RecvThreadListener());
new Thread(rt).start();
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,154
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,623
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,465
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,239
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,874
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,042