spring运行时注入bean,调用spring bean方法出错

  spring运行时注入bean,调用spring bean方法出错

  00-1010通过在Spring多线程中外部引入bean注入来封装线程子类注入的线程中无效Bean错误的注入方法。主要的在线解决方案有

  00-1010在Spring项目中,有时需要打开新的线程来完成一些复杂的任务,可能需要在线程中注入一些服务。通过Spring injection来管理和使用服务是一种合理的方式。但是通过注释直接在Thread子类中注入Bean是无效的。

  由于Spring本身的默认bean是由singleton模式构建的,是非线程安全的,所以禁止在Thread子类中的注入行为,所以直接在线程中注入的Bean是null,会出现null指针错误。

  下面列举了错误的注射方法和两种解决方法。

  00-1010 @ controller public class some controller { @ response body @ request mapping( test )字符串测试注入(){//直接创建并运行线程newsomething()。start();} }//写线程public something直接扩展thread { @ autowired someservice someservice;@Override public void run(){ //做点什么.someservice . do something();//此时someService实例为空。}}报告NullpointException。

  00-1010人推荐这种方法,对外代码影响不大。

  @ controller公共类some controller {//bean @ autowired someread something通过批注注入到封装的线程中;@ response body @ request mapping( test )字符串测试注入(){//通过注入的Bean启动线程somethread . execute();}} @组件公共类Something Read {//将服务注入包Bean @ autowired Something service Public void execute(){ new worker()。start();}//Thread内部类,Thread或Runnable可以是私有类worker extends Thread { @ override public void run(){//do something.读过的东西。this . someservice . do something();//此时已经注入了someService,不为null。} }}正常调用someService。

  00-1010是获取一个可以注入的可用实例,然后通过Thread子类的构造函数引入。这样会使代码修改影响到每一个使用Thread子类的代码,修改工作量会很大。

  @ controller公共类some controller {//通过评论注入service @ autowired someservice someservice;@ response body @ request mapping( test )字符串测试注入(){//引入新的Worker(someService)。通过构造函数从外部启动();} } public class SomeThread { private SomeService SomeService;public something read(someService someService){//通过构造函数从外部引入this.someService=someService} @Override public void run() { //做点什么.someservice . do something();//someService此时不为null。}}

  00-1010最近,我们遇到了一个问题。使用SSM框架,我们需要在服务层打开另一个线程。这个线程专用于执行一些操作,并将结果写入数据库。但是在线程中使用@Resource或者@Autowired的注入都是NULL。原来弹簧无法注入螺纹。

  

目录

将所需的Bean作为线程构造函数的参数传入。使用ApplicationContext.getBean方法静态获取Bean。我的线程中需要的beans数量较大,以后可能会增加或减少,所以方法1不适合。

 

  我没有一个以上的Spring配置文件,使用getBean方法需要重新加载所有Bean,这也违反了Spring的IoC,这不是我想要的,所以我不使用方法2。

  最后用内部类的方法提前注入线程中需要的Bean。大致结构如下:

  @Serviceclass TestExample{ //这两个beans是线程@ resourcetestdao testdao所必需的;@ Resource NeedDap needDaovoid service execute(){//在这里启动线程,执行操作thread example te=new thread example();te . start();}//内部类私有类Thread Example扩展Thread { Public Thread Example(){//也可以传入参数} public void run(){ //下面是Thread的操作//注入后可以使用Bean } } }以上是我的个人经验。希望可以给大家一个参考,也希望大家多支持盛行的IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: