Spring容器-ApplicationContext的单例设计

Spring容器-ApplicationContext的单例设计

每次通过new创建一个ApplicationContext容器,都会执行refresh方法,看源代码了解到这个refresh方法会重新加载配置文件,并且这个创建的容器对象持有一个所有singleton类型bean的map集合,从而实现单例,而且这个map对象的生命周期和容器对象的生命周期是一样的 
如果我们每次都通过new一个容器对象,那么每次都要重新加载配置文件,都要重新生成这个singleton bean的集合,这样所谓的单例就失去了意义 
在实际的应用中,ApplicationContext容器对象是不是不是象开始说的那样每次都new一个,还是我事先创建好一个ApplicationContext容器对象,而把它保存到某一个地方,而我在需要这个容器的时候取来用即可(就像struts中RequestProcessor对action的缓存一样,最终由ServletContext控制)

在web应用开发中,我们可以将ApplicationContext容器的启动放在web容器的初始化中实现,这样Spring容器就存放于web容器(servletContext)当中,应用时取出即可。

而在普通的应用程序中,就需要客户化的代码来实现,最简单的方式就是用一个单例类来封装这个ApplicationContext容器

用户使用spring配置了N多个Bean. 在web中,spring的bean的获得,常常需要 ApplicationContext对象,或WebApplicationContextUtils类,这些都需要用户的 代码在spring的管理之内,脱离了spring的管理范围,尽管这些bean在你的工程都存在, 但是你却无法访问。

时间: 2024-12-29 15:25:15

Spring容器-ApplicationContext的单例设计的相关文章

Spring容器-ApplicationContext的启动过程

转载自: http://blog.163.com/[email protected]/blog/static/118777042009410248557/ 这片博客信息量很大,言简意赅.简明扼要地说清楚了Spring容器的启动过程,前面红色的“打比方”可以忽略... Spring容器像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式进行工作.如果我们将Spring容器比喻为一辆汽车,可以将BeanFactory看成汽车的发动机,而ApplicationContex

【小白的java成长系列】——构造方法私有化(单例设计)

有了解过spring框架的童鞋们就知道,spring的bean默认是什么形式呀?---单例形式的. 问:那什么叫做单例?单例其实就是Singleton,顾名思义就是只有单个的实例对象操作. 那为什么要使用单例呢? 至于这个问题,后面再做解释,我们先看代码: package me.javen.oop; public class SingletonDemo { public static void main(String[] args) { Singleton singleton1 = Single

SSM-Spring-05:Spring的bean是单例还是多例,怎么改变?

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- Spring的bean是单例的 它在Spring容器初始化的时候创建对象 可以修改为多例,在此bean节点中添加一个属性,scope="prototype" 例如<bean id="xxx" class="全类名" scope="prototype"></bean> 然后多次getbean操作,会获取不同的实例化对

Java设计模式中的单例设计

/** * 单例设计模式 * 应用场合:只需要一个对象的 * 作用:保证整个应用程序中某个实例有且只有一个 * 类型有:饿汉模式.懒汉模式 * 下面的例子是一个饿汉模式的例子 */ class SingleDemo { // 1.将构造方法私有化,不允许外部直接创建使用 private SingleDemo() {} // 2.创建类的唯一实例,使用private static修饰 private static SingleDemo instance = new SingleDemo(); //

【Spring】8、Spring框架中的单例Beans是线程安全的么

看到这样一个问题:spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的.如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全. 最浅显的解决办法就是将多态bean的作用域由"singleton&

Spring工作原理与单例

最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet为了能并发执行, 是因为servlet被这些thread使用,tomcat里创建响应的socketServer线程类接收请求连接,然后在再创建或引用对应的servlet实例来处理请求连接.servlet是单例的,只创建一次.所以最好不要使用serlvet中的实例字段. spring中的bean对象默

spring的controller是单例还是多例,怎么保证并发的安全

controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱.正因为单例所以不是线程安全的. 我们下面来简单的验证下: package com.riemann.springbootdemo.controller; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.we

spring自动注入是单例还是多例?单例如何注入多例?

单例多例需要搞明白这些问题:      1. 什么是单例多例:      2. 如何产生单例多例:      3. 为什么要用单例多例      4. 什么时候用单例,什么时候用多例:   1. 什么是单例.多例: 所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 单例模式和多例模式说明: 1. 单例模式和多例模式属于对象模式. 2. 单例模式的对象在整个系统中只有一份,多例模式可以有

单例设计

常见的单例设计模式有以下7种 1.懒汉  线程不安全 public class Singleton { private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } 所谓懒汉 , 就是初始化类的时候不创建实例 , 什么时候使