我就想问,像这一个像锁一样的图标应用锁是怎么弄的

【Spring学习笔记-6】关于@Autowired与@Scope(BeanDefination.SCOPE_PROTOTYPE) - ssslinppp - 博客园
当类被@Scope(BeanDefination.SCOPE_PROTOTYPE)修饰时,说明每次依赖注入时,都会产生新的对象,具体可参见文章:&但是在多线程编程中,如果一个类被@Scope(BeanDefination.SCOPE_PROTOTYPE)修饰,且在另外的对象中如果需要引用此对象时,最好不要使用@Autowired依赖注入,而是使用 ApplicationContext.getBean()的方式去调用。举例说明:下面的这个类被@Scope(BeanDefinition.SCOPE_PROTOTYPE),@Component@Scope(BeanDefinition.SCOPE_PROTOTYPE)public class LoadData extends Thread {...}在MyMultiThread.java中需要多次使用上面的LoadData.java对象,每次都需要重新创建新的对象@Componentpublic class&MyMultiThread{.....for (多次) {
& & & & &LoadData& loadData&&=XXX.getApplicationContext().getBean( LoadData .class);
loadData&&.start(); & & }}通过上面的方式,使用getApplicationContext().getBean()能保证每次拿到的都是新创建的LoadData对象,而如果是在MyMultiThread中通过@Autowired去依赖注入,就不能(不会)每次都创建新的LoadData对象,除非是创建了多个MyMultiThread对象,而这并不是我们希望做的。总结:当类被@Scope(BeanDefination.SCOPE_PROTOTYPE)修饰时,推荐使用getApplicationContext().getBean()去获取对象;当类没有被@Scope(BeanDefination.SCOPE_PROTOTYPE)修饰时,可以使用@Autowired按类型自动注入,减少编码;Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。  @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。  @Resource装配顺序  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;我们知道,Spring bean 默认的 scope 是 singleton(单例),但有些场景(比如多线程)需要每次调用都生成一个实例, 此时 scope 就应该设为 prototype。如:
@Component @Scope(&prototype&)
public class DadT
我们知道,Spring bean 默认的 scope 是 singleton(单例),但有些场景(比如多线程)需要每次调用都生成一个实例, 此时 scope 就应该设为 prototype。如:
@Component @Scope("prototype")
public class DadTask implements Runnable {
static Logger logger = Logger.getLogger(DadTask.class);
@Autowired
DadDao dadD
*/ public DadTask setDadTask(String name) {
this.name =
return this;
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/ @Override public void run() {
("DadTask:"+this + ";DadDao:"+dadDao + ";"+dadDao.sayHello(name) );
//("Dad:"+name);
但是,如果 singlton bean 依赖 prototype bean ,通过依赖注入方式, prototype bean 在 singlton bean 实例化时会创建一次(只一次), 比如:
@Service public class UserService {
@Autowired private DadTask dadT
public void startTask() {
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(2);
scheduledThreadPoolExecutor.scheduleAtFixedRate(dadTask.setDadTask("Lily"), 1000, 2000, TimeUnit.MILLISECONDS);
scheduledThreadPoolExecutor.scheduleAtFixedRate(dadTask.setDadTask("Lucy"), 1000, 2000, TimeUnit.MILLISECONDS);
我希望调度“Lily” 和 “Lucy” 两个线程,实际上,它只给我初始化一个实例(这样就线程非安全了)。
如果 singlton bean 想每次都去创建一个新的 prototype bean 的实例, 需要通过方法注入的方式。 可以通过实现 ApplicationContextAware 接口,来获取到 ApplicationContext 实例, 继而通过 getBean 方法来获取到 prototype bean 的实例。我们的程序需要修改如下:
@Service public class UserService implements ApplicationContextAware {
@Autowired private DadTask dadT
private ApplicationContext applicationC
public void startTask() {
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(2);
// 每次都拿到 DadTask 的实例
dadTask = applicationContext.getBean("dadTask", DadTask.class);
scheduledThreadPoolExecutor.scheduleAtFixedRate(dadTask.setDadTask("Lily"), 1000, 2000, TimeUnit.MILLISECONDS);
dadTask = applicationContext.getBean("dadTask", DadTask.class);
scheduledThreadPoolExecutor.scheduleAtFixedRate(dadTask.setDadTask("Lucy"), 1000, 2000, TimeUnit.MILLISECONDS);
@Override public void setApplicationContext (ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationC
OK ,问题解决
中 beanScope 目录
用云栖社区APP,舒服~
【云栖快讯】快速解决数据库难题,云数据库经典案例及最佳实践直播专场!阿里云数据库专家团队成员倾囊相授!赶紧报名。&&
是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有...
深度挖掘企业与企业、企业与人物的关系,通过多位交叉分析及智能算法,构建基于企业全息画像和企业关系网络的风险洞察、...
是将源站内容分发至全国所有的节点,缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性,解决网络带宽...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017云栖大会·上海峰会火热报名中
Loading...扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
spring的bean的 scope问题,在service及dao中 什么情况下 必须用prototype呢在sping里 为什么 service和 dao 的bean 的 scope熟悉往往是 默认的 singleton,无状态,在什么情况下才要用prototype呢,请举例说明下,本人 也知道 service 和 dao 和 action不一样,action必须为prototype ,但是我希望有高手 什么情况下 service就不能用 默认的 scope属性了.希望能举例说明,3Q
维它命1386
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
先说说单例(Singleton):如果使用单例模式,就说明系统中只有一个实例,这个实例的状态和数据都是共享的. 比如你有一个Class是FoodFactory,里面有一个属性是List foodList,你希望每个请求都能共享到这个list,那么就应该是单例的.或者删除或者添加,操作的都是同个对象的list. 如果是prototype模式, 那么你每个请求过来,都会给你初始化一个FoodFactory,foodList也就不可能共享了.action使用prototype那是必须的,因为每个请求的参数都不同,返回也不同,是有状态的.也就是说,不能让小一的请求,使用的小二的信息给他返回.service和dao一般使用singleton, 因为service一般是通过具体的dao来实现他的特定的一些服务. 而对于dao,他所做的事情无非是通过sessionFactory创建session来操作数据库,所以对于每个请求,只要共享他的session就行了. 这过程中无需给service 或者dao传递参数,是没有状态的. 当然如果硬要用prototype也是可以的,只是浪费资源而已.
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 像个锁的皮带 的文章

 

随机推荐