Spring 多线程下注入bean问题详解
程序员文章站
2024-02-23 22:34:58
本文介绍了spring 多线程下注入bean问题详解,分享给大家,具体如下:
问题
spring中多线程注入userthreadservice注不进去,显示userth...
本文介绍了spring 多线程下注入bean问题详解,分享给大家,具体如下:
问题
spring中多线程注入userthreadservice注不进去,显示userthreadservice为null异常
代码如下:
public class userthreadtask implements runnable { @autowired private userthreadservice userthreadservice; @override public void run() { adeuser user = userthreadservice.get("0"); system.out.println(user); } }
解决方案一
把要注入的service,通过构造传过去,代码如下:
public class userthreadtask implements runnable { private userthreadservice userthreadservice; public userthreadtask(userthreadservice userthreadservice) { this.userthreadservice = userthreadservice; } @override public void run() { adeuser user = userthreadservice.get("0"); system.out.println(user); } }
thread t = new thread(new userthreadtask(userthreadservice)); t.start();
解决方案二
通过applicationcontext中获取需要使用的service
import org.springframework.beans.beansexception; import org.springframework.context.applicationcontext; import org.springframework.context.applicationcontextaware; public class applicationcontextholder implements applicationcontextaware { private static applicationcontext context; @override public void setapplicationcontext(applicationcontext context) throws beansexception { applicationcontextholder.context = context; } //根据bean name 获取实例 public static object getbeanbyname(string beanname) { if (beanname == null || context == null) { return null; } return context.getbean(beanname); } //只适合一个class只被定义一次的bean(也就是说,根据class不能匹配出多个该class的实例) public static object getbeanbytype(class clazz) { if (clazz == null || context == null) { return null; } return context.getbean(clazz); } public static string[] getbeandefinitionnames() { return context.getbeandefinitionnames(); } }
spring 加载自己定义的applicationcontextholder类
<bean class = "cn.com.infcn.applicationcontext.applicationcontextholder"></bean>
根据 bean 的名称获取实例
复制代码 代码如下:
userservice user = (userservice) applicationcontextholder.getbeanbyname("userservice");
根据 bean 的class 获取实例(如果该class存在多个实例,会报错的)
复制代码 代码如下:
userservice user = (userservice) applicationcontextholder.getbeanbytype(userservice.class);
这种方式,不管是否多线程,还是普通的不收spring管理的类,都可以使用该方法获得spring管理的bean。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Spring 多线程下注入bean问题详解
-
解决SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题
-
详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决
-
Spring Bean三种注入方式详解
-
Spring bean的实例化和IOC依赖注入详解
-
详解Spring中bean的几种注入方式
-
Spring循环依赖正确性及Bean注入的顺序关系详解
-
详解Spring中bean的几种注入方式
-
Spring循环依赖正确性及Bean注入的顺序关系详解
-
详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决