http://www.360doc.com/content/12/1201/17/820209_251401948.shtml
package com.hehe.eppage.framework.sysutil;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.travelsky.eppage.framework.system.EPPConstants;
public class ApplicationContextUtil implements ApplicationContextAware{
private static ApplicationContext ctx = null;
private static ApplicationContext getContext(){
if (ctx == null) {
synchronized (ApplicationContextUtil.class) {
if (ctx == null ) {
ctx = new ClassPathXmlApplicationContext(new String[]{"classpath:EPPage_applicationContext_basic.xml","classpath:EPPage_system_service.xml"});
}
}
}
return ctx;
}
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
// TODO Auto-generated method stub
this.ctx = ctx;
}
}
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在你的工程都存在, 但是你却无法访问。
分享到:
相关推荐
例如,Spring框架中的ApplicationContext就是通过单例模式来管理所有bean的。然而,需要注意的是,过度使用单例可能导致系统设计过于紧密,不利于测试和扩展,因此在设计时应权衡利弊。 总之,单例模式是一种常用的...
下面是一个简单的懒汉模式实现单例模式的示例代码: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance ==...
单例模式有多种实现方式,主要包括: 1. **饿汉式(静态常量)**:在类加载时就完成了初始化,所以没有线程安全问题,但这种方式并不懒加载,如果单例对象创建很耗时,可能会造成浪费。 ```java public class ...
单例模式主要分为两种实现方式:饿汉式和懒汉式。 #### 1. 饿汉式 饿汉式在类加载时即创建实例,因此它保证了线程安全,不会出现多个实例。但是这种方式可能导致资源浪费,因为即使未使用,也会预先创建对象。 - ...
懒汉式单例模式的实现方式是提供一个静态对象instance,构造函数私有化防止外部创建对象,提供一个静态的getInstance方法来给访问者一个单例对象。这种写法的缺点就是没有考虑到线程安全问题,当多个访问者同时访问...
Spring框架中的`ApplicationContext`就是一个典型的单例模式应用,保证在整个应用程序中只有一个`ApplicationContext`实例。在JDK中,`java.lang.Runtime`类也是一个单例,它提供与Java运行时系统交互的方法。 总...
Spring框架广泛地应用了三种主要的Java设计模式:单例模式、工厂模式和代理模式。这些模式为Spring提供了灵活性、可扩展性和高效的资源管理。 首先,单例模式是Java编程中最常见的设计模式之一。它保证一个类只有一...
例如,Spring框架中的ApplicationContext就是单例模式的典型应用。 2. 工厂模式:Java集合框架中的ArrayList和LinkedList就是工厂模式的体现,它们根据不同的需求创建不同类型的列表实例。 3. 装饰器模式:Java I/...
Spring框架中,ApplicationContext就是单例模式的典型应用,它是Spring容器的实例,确保在整个应用程序中只有一个ApplicationContext存在。 5. **Spring中的设计模式**: - **简单工厂模式**:Spring的BeanFactory...
单例模式体现在ApplicationContext中,保证整个应用只有一个实例;而代理模式则体现在AOP(面向切面编程)中,通过动态代理实现方法拦截。 3. 工具在设计模式中的作用 在开发过程中,工具可以帮助我们更好地理解和...
7. **更丰富的初始化**:ApplicationContext在启动时会初始化所有单例bean,确保在应用运行时,所有bean都已准备好。 在实际应用中,我们通常推荐使用ApplicationContext,因为它提供了更为全面的特性集,适合于...
总的来说,Spring通过IoC和工厂模式实现了对bean的高效管理,通过单例模式确保了特定bean的唯一性。这种设计使得代码更加模块化,降低了组件间的耦合度,提高了系统的可维护性和可扩展性。在实际开发中,理解并熟练...
总的来说,Spring通过工厂模式和单例模式实现了bean的高效管理,依赖注入机制则使得代码更加灵活和解耦,提高了组件的可测试性和可维护性。深入理解和熟练运用这些概念,将有助于提升开发效率和软件质量。
- **ApplicationContext**:尽管 Spring 的 BeanFactory 接口支持多种作用域,但 ApplicationContext 常常用于实现单例模式。它不仅管理着应用程序中的所有 Bean 的生命周期,还提供了全局的访问点。这种方式确保了...
在单例模式中,有两种常见的实现方式: 1. 饿汉式:在类加载时就初始化,保证了线程安全,但可能造成资源浪费。 2. 懒汉式:延迟加载,首次调用时创建单例。为了线程安全,可以使用双重检查锁定(DCL)和volatile...
例如,我们可以使用单例模式来实现不同的 Bean 创建策略,从而满足不同的业务需求。 Spring 框架使用了多种设计模式来实现其功能。这些设计模式使得 Spring 框架更加灵活、可扩展和高效。了解这些设计模式可以帮助...
在Java中,实现单例模式通常有两种方式:饿汉式单例和懒汉式单例。 **饿汉式单例**: 饿汉式单例在类加载时就完成了初始化,因此类加载时间较长,但获取实例的速度非常快,且线程安全。代码如下: ```java public ...
7. **单例Bean的缓存**:对于单例模式的Bean,Spring会将其缓存,后续请求相同Bean时,直接返回缓存的实例,避免重复创建。 8. **生命周期管理**:Spring提供了多种生命周期接口,如InitializingBean、...
2. 单例模式:Spring默认将Bean设为单例模式,保证在整个应用中只有一个Bean实例。可以通过设置bean的scope属性来改变这个行为。 3. 抽象工厂模式:Spring允许定义Bean工厂的抽象类,实现特定的Bean创建逻辑。 4. ...