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

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

我有一个类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. syscolumns表中所有字段的意思

    --syscolumns表中所有字段的意思 name sysname --列名或过程参数的名称. id int --该列所属的表对象 ID,或与该参数关联的存储过程 ID. xtype tinyint ...

  2. Openstack的error僵尸实例的解决办法

    在我们对集群环境进行各种调整的情况下,很容易产生一些僵尸实例. 僵尸实例主要是没有该主机,但是在dashboard上,数据库中存在,解决办法网络上有的人给出了繁杂的修改数据库的方法,其实按照下面的命令 ...

  3. Nginx防蜘蛛爬虫处理

    假定一个场景:某个网站它可能不希望被网络爬虫抓取,例如测试环境不希望被抓取,以免对用户造成误导,那么需要在该网站中申明,本站不希望被抓取.有如下方法: 方法一:修改nginx.conf,禁止网络爬虫的 ...

  4. svn使用相关问题:eclipse插件,加锁,解锁,偷锁,更新不了,记住密码

    svn使用相关问题:eclipse插件,加锁,解锁,偷锁,更新不了,记住密码 获取锁的时候可以看下 是谁锁住了,让对方提交解锁,如果是给离职人员锁住需要使用偷锁的方式先解锁再提交偷锁处理办法:选中该文 ...

  5. org.hibernate.MappingException: Unknown entity常见问题。回顾笔记,以前没记,现在补上,xiaochao写的蛮好的直接给转载了。

    转自http://www.blogjava.net/xiaochao/articles/hibernatetopic.html. 官方说明如下: Hibernate遵循EJB3.0实体bean的注解规 ...

  6. DockerUI安装、使用

    虽然大多数开发人员和管理人员通过命令行来创建及运行Docker容器,但Docker的Remote API让他们可以通过充分利用REST(代表性状态传输协议)的API,运行相同的命令.这时,Docker ...

  7. anroid 查看签名信息的方法

    1.把app改成压缩文件 2.解压以后找到META-INF\CERT.RSA 3.在CMD命令行里面输入:  keytool -printcert -file  E:\META-INF\CERT.RS ...

  8. 通过spring工厂读取property配置文件

    /** * Created by ywq on 2016/6/30. */ @Named public class PropertyConfig { private static AbstractBe ...

  9. 温故而知新 clone

    浅复制(浅克隆) 被复制对象所有变量都含有与原来对象的相同值,对象中对其他对象的引用仍然指向原来的对象,换言之,复制对象只复制考虑的对象,而不复制所引用的对象.继承自java.lang.Object类 ...

  10. 20150629_Andriod_06_插入_删除_弹出式操作数据

    Fr_06_view_s6 --> activity_f6_insert              --> activity_f7__delete ******************** ...