花了至少一整天的时间解决了这个问题,必须记录这个纠结的过程,问题不可怕,思路很绕弯。

为了能说清楚自己的问题,我都用例子来模拟。

我有一个类MyThread是这样的:

 @Service
public class MyThread extends Thread {
3 @Autowired
4 MyService myService;
5 ......
6 }

在主线程中有这样一个调用:

 @Autowired
MyThread myThread;
......
public void invoke{
if(condition){
myThread.start();
}
}
......

我的invoke存在一个循环调用,此时遇到了第一个问题!

问题一:抛出java.lang.IllegalThreadStateException。

问题一的解决:

 //@Autowired
//MyThread myThread;
......
public void invoke {
if(condition){
6 //myThread.start();
MyThread myThread = new MyThread();
myThread.start();
}
}

引发的新的问题!

问题二:我用了Spring注解,用new的话无法用注解实现注入,所以myThread中的myService对象抛出空指针。

问题二的解决:放弃了MyThread类,新写了一个类,开始绕弯。

 @Service
public class MyRunable implements Runnable {
@Autowired
MyService myService;
......
}

相应的,修改主线程中的调用。

  //@Autowired
//MyThread myThread;
@Autowired
MyRunnable myRunnable;
......
public void invoke{
if(condition){
//MyThread myThread = new MyThread();
//myThread.start();
Thread t = new Thread(myRunnable);
t.start();
}
}
......

又遇到了新的问题!

我需要对myRunnable线程命名。即在invoke方法中增加这么一行:

 ......
myRunnable.setName(name);//增加的一行
Thread t = new Thread(myRunnable);
......

问题三:后面命名的myRunnable线程名称竟然覆盖前面的命名。

打印myRunnable对象,很容易判断出来这个对象是单例模式,所以每次改动都会影响以前的调用。

查了Spring的相关资料,得到结论,Spring默认管理类的模式就是“单例模式”,我需要改成非单例的。

尝试改动一:

 //增加了对象使用创建模式的注解
@Service
@Scope("prototype")
public class MyRunable implements Runnable {
@Autowired
MyService myService;
......
}

运行,问题依旧。然后就卡住了,甚至评估放弃Spring?一路new下去得了……

直到某一刻灵光闪现,发现虽然现在MyRunnble是非单例模式,但是在invoke的那个类中,Spring只在加载这个类时初始化了一个MyRunnable对象啊……

问题三的解决:

    //@Autowired
//MyThread myThread;
//@Autowired
//MyRunnable myRunnable;
......
public void invoke{
if(condition){
//MyThread myThread = new MyThread();
//myThread.start();
MyRunnable myRunnable = SpringContextUtil.getApplicationContext().getBean("myRunnable",MyRunnable.class);
Thread t = new Thread(myRunnable);
t.start();
}
}
......

这一步需要声明的是SpringContextUtil类有时间需要单独写一篇,先理解原理,就是每次从Spring容器中生成一个全新[scope("prototype")]的对象。

到这里,问题全部解决了……等等!

感觉MyThread类被抛弃好无辜啊!最终改成了这个样子的:

 MyThread myThread = SpringContextUtil.getApplicationContext().getBean("myThread", MyThread.class);

Spring注解【非单例】的更多相关文章

  1. atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29

    atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29 1. 三 绑定方式的介绍1 2. To接口,链式绑定,用的最多的1 3. toC ...

  2. spring中如何向一个单例bean中注入非单例bean

    看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如 ...

  3. 【Java面试宝典】说说你对 Spring 的理解,非单例注入的原理?它的生命周期?循环注入的原理, aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工作的?

    AOP与IOC的概念(即spring的核心) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度.而sprin ...

  4. 转:【Spring MVC Controller单例陷阱】

    http://lavasoft.blog.51cto.com/62575/1394669/ Spring MVC Controller默认是单例的: 单例的原因有二:1.为了性能.2.不需要多例. 1 ...

  5. Spring MVC Controller单例陷阱

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lavasoft.blog.51cto.com/62575/1394669 Spr ...

  6. Spring bean 和单例bean的线程安全

    Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).prototype(原型).request.session和global session,5种作用域说 ...

  7. Spring中的单例一二

    Spring框架很好的帮助我们创建和管理dao.bean.service.action等对象, 但是它创建的对象是单例呢还是多例,又有哪些区别以及为什么 1.在Spring中默认创建的是单例模式,简单 ...

  8. spring如何解决单例循环依赖问题?

    更多文章点击--spring源码分析系列 1.spring循环依赖场景2.循环依赖解决方式: 三级缓存 1.spring循环引用场景 循环依赖的产生可能有很多种情况,例如: A的构造方法中依赖了B的实 ...

  9. Spring对象类型——单例和多例

    由于看淘淘商城的项目,涉及到了项目中处理spring中bean对象的两种类型,分别是单例和多例,就在此记录一下,方便加深理解,写出更加健壮的代码. 一.单例和多例的概述 在Spring中,bean可以 ...

随机推荐

  1. 由ccf第一题引出的问题

    当时的情况是这样的,代码中需要用到一个较大的二维数组,但只要定义这个大二维数组编译就出错,无奈后来用malloc自己实现了类似二维数组的操作. 其中的b数组设为全局的或者静态的也都可以解决overfl ...

  2. python核心编程学习记录之基础知识

    虽然对python的基础知识有所了解,但是为了更深入的学习,要对python的各种经典书籍进行学习 第一章介绍python的优缺点,略过 第二章介绍python起步,第三章介绍python基础,仅记录 ...

  3. laravel数据库的创建和迁移

    数据库建立及迁移 Laravel 5 把数据库配置的地方改到了 `learnlaravel5/.env`,打开这个文件,编辑下面四项,修改为正确的信息: ? 1 2 3 4 5 6 7 DB_HOST ...

  4. Python 的命令行参数处理 optparse->argparse

    optaprse自2.7版开始弃用:弃用optparse模块,不会进一步开发,将继续开发argparse模块作为替代. 但是用习惯了optparse,还是很好用的撒. optparse使用起来,相比旧 ...

  5. iOS 开发 证书总结 开发证书和生产证书的区别

    IOS开发 证书总结 开发者证书   ------>>  开发证书是你在真机推送时 用得, 生产证书是app 上架之后 推送给用户用的 首先你必须获得apple开发者证书,上图这个文件就是 ...

  6. NSAssert用法

    今天突然发现了一个开发ios程序时调试的好帮手-NSAssert()函数.而且和NSLog()函数一样简单易用,代码如下: NSAssert(x!=0,@"x must not be zer ...

  7. HTML5与CSS3权威指南

    第一章:Web时代的变迁 HTML5放心使用的理由: 兼容性:HTML5在老板本的浏览器上也可以正常运行: 实用性:HTML5内部并没有封装什么很复杂的,不切实际的功能,而只是封装了简单实用的功能: ...

  8. Shell—学习之心得

    由于项目要招聘需要有经验shell开发人员(awk编程),而作为技术面试官(暂时)的我对shell编程不太熟:当然以前也写过一些shell脚本来满足项目的需求—备份环境,数据库(逻辑).假如只是针对a ...

  9. VI 命令简介

    1.打开一个文件  vi 文件路径 2.命令模式转换  输入模式 i  命令模式  esc 3.复制 和 粘贴 1)将光标移动到将要复制的行处,按yy进行复制当前行(按nyy复制n行),再移动到粘贴位 ...

  10. YTU 2991: 链表节点逆置(线性表)

    2991: 链表节点逆置(线性表) 时间限制: 1 Sec  内存限制: 128 MB 提交: 14  解决: 6 题目描述 设计一个算法,将一个带头节点的数据域依次为a1,a2,-,an(n> ...