`

一个ServiceLocator模式的实现

阅读更多
 废话不说,代码说话:
import javax.naming.*;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.ejb.EJBHome;
import javax.ejb.EJBLocalHome;
import javax.sql.DataSource;
import java.util.*;
import java.sql.*;

/** *//**
 *  实现 service locater 模式,用于由客户端来调用以通过JNDI查
 *  找相关的 ejb或是其它服务的入口.
 * 
*/

public final class ServiceLocater {

  
protected static ServiceLocater inst = new ServiceLocater();
  
private InitialContext ic = null;
  
private Map ejbHomeCache = null;
  
private Map dataSourceCache = null;
  
protected ServiceLocater() {
    
try {
      dataSourceCache 
= Collections.synchronizedMap(new HashMap());
      ejbHomeCache 
= Collections.synchronizedMap(new HashMap());
      ic 
= new InitialContext();
    }

    
catch (Exception e) {
      e.printStackTrace();
    }

  }


  
/** *//**
   * 取得 servicelocater的单子实例.
   * 
*/

  
synchronized public static ServiceLocater getInstance() {
    
return inst;
  }


  
/** *//**
   *查找并返回一个数据源
   * 
@param name String 数据源名称
   * 
@return DataSource ,查找不到则抛出异常.
   * 
@throws NamingException ,查找不到或是类型不对。
   * 
*/

  
private DataSource lookUpDataSource(String name) throws NamingException {
    DataSource tmpDS 
= (DataSource)this.dataSourceCache.get(name);
    
if (tmpDS == null{
      
try {
        tmpDS 
= (DataSource)this.ic.lookup(name);
        
this.dataSourceCache.put(name, tmpDS);
      }

      
catch (NamingException namE) {
        
throw namE;
      }

      
catch (Exception otherE) {
        
throw new NamingException(otherE.getMessage());
      }

    }

    
return tmpDS;
  }


  
/** *//**
   * 查找并返回一个远程接口
   * 
@param jndiHomeName ebj名字
   * 
@param className  ejb类名字
   * 
@return
   * 
@throws ServiceLocatorException
   
*/

  
public EJBHome getRemoteHome(String jndiHomeName, Class className) throws
      ServiceLocatorException 
{
    EJBHome home 
= (EJBHome)this.ejbHomeCache.get(jndiHomeName);
    
if (home == null{
      
try {
        Object objref 
= ic.lookup(jndiHomeName);
        Object obj 
= PortableRemoteObject.narrow(objref, className);
        home 
= (EJBHome) obj;
        
this.ejbHomeCache.put(jndiHomeName, home);
      }

      
catch (NamingException ne) {
        
throw new ServiceLocatorException(ne);
      }

      
catch (Exception e) {
        
throw new ServiceLocatorException(e);
      }

    }

    
return home;
  }


  
/** *//**
   * 查找并返回一个本地接口
   * 
@param jndiHomeName  jndiHomeName名字
   * 
@return 一个本地接口
   * 
@throws ServiceLocatorException
   
*/

  
public EJBLocalHome getLocalHome(String jndiHomeName) throws
      ServiceLocatorException 
{
    EJBLocalHome home 
= null;
    
try {
      home 
= (EJBLocalHome) ic.lookup(jndiHomeName);
    }

    
catch (NamingException ne) {
      
throw new ServiceLocatorException(ne);
    }

    
catch (Exception e) {
      
throw new ServiceLocatorException(e);
    }

    
return home;

  }


  
/** *//**
   *查找一个数据源,并取得一个连接.
   * 
@param name String 数据源名称
   * 
@return DataSource ,查找不到则抛出异常.
   * 
@throws NamingException ,查找不到或是类型不对。
   * 
*/

  
public Connection getConnection(String DataSourceJNDIName) throws
      SQLException 
{
    
try {
      Connection conn 
= this.lookUpDataSource(DataSourceJNDIName).getConnection();
      conn.setAutoCommit(
false);
      
//conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
      return conn;
    }

    
catch (Exception e) {
      e.printStackTrace();
      
throw new SQLException(e.getMessage());
    }

  }


}
分享到:
评论

相关推荐

    swift-Locatable是一个Swift微框架它利用PropertyWrappers通过自定义属性@Locatable实现ServiceLocator模式

    Service Locator模式的基本思想是,维护一个全局的服务容器,其中存放了所有可用的服务实例。当需要使用某个服务时,只需从容器中查找即可,而无需直接依赖具体的服务实现。这样,我们可以在运行时动态地替换或注入...

    Autofac的ServiceLocator模式应用,零配置

    总结来说,Autofac的ServiceLocator模式应用结合零配置,使得我们可以更轻松地管理和解耦应用程序中的组件。通过自动扫描、特性注解和模块化,我们可以减少大量手动配置,同时保持代码的清晰和可维护性。在`...

    11-ServiceLocator-Code.zip

    在"11-ServiceLocator-Code.zip"压缩包中的"Code"文件,很可能包含了实现服务定位器模式的示例代码。通过对这些代码的分析,我们可以看到服务定位器是如何工作的,以及它与依赖注入的区别。通过学习这段代码,开发者...

    Android-SimpleLocator是一个用于Android轻量级和快速的ServiceLocator

    "Android-SimpleLocator"正是一个针对Android平台的轻量级、高效的Service Locator实现,它简化了依赖注入的过程,使得开发者能够更加专注于业务逻辑。 服务定位器(Service Locator)是一种全局性的依赖查找容器,...

    几种测试Service的方法

    ServiceLocator是一个单例模式的类,用于管理和提供对Service的访问。例如: public class ServiceLocator { private static ServiceLocator serviceLocator = null; private BeanFactory factory = null; ...

    Laravel开发-locator

    在本文中,我们将深入探讨Laravel开发中的"locator"项目,这是一个简单的本地路由器。通过理解这个项目,我们可以学习到Laravel框架的核心概念以及如何构建自定义的路由解决方案。首先,让我们了解一下Laravel。 ...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) ... 服务定位器模式(Service Locator Pattern) 传输对象模式(Transfer Object Pattern) 生产者消费者模式(Producer Consumer Pattern)

    实用J2EE设计模式编程指南

    Service Locator模式 使用持久性框架 持久性框架策略 小结 第4章 改进性能与伸缩性的设计模式 性能问题的原因 伸缩性问题的原因 城市休假订票应用程序 标识提高性能的模式 标识提高伸缩性的模式 完整City Break...

    23种JAVA设计模式和15种J2EE设计模式

    4. **Service Locator模式**:提供服务发现和定位的功能,简化了组件间的依赖。 5. **Front Controller模式**:作为Web应用的单一入口点,负责请求分发。 6. **Model-View-Controller (MVC)模式**:将业务逻辑、...

    论文研究-网络流量分析系统的设计与实现.pdf

    面向插件的应用框架具有易于复用和动态...通过一个实例介绍了如何改进Service Locator模式使之更好地管理大量的细粒度短生命周期的插件对象,并展示了采用改进的Service Locator模式来设计面向插件的应用框架的方法。

    ServiceLocator:.NET IoC 容器和服务定位器

    本文将深入探讨ServiceLocator模式,以及它在.NET中的实现,特别是与C#编程语言的结合。 服务定位器的核心理念是提供一个全局注册表,它存储了所有服务实例或服务接口的映射。当一个类需要依赖其他服务时,它不直接...

    Java Service Locator Information Manager-开源

    JSlim,全称为"Java Service Locator Information Manager",是一个专门针对J2EE应用设计的开源工具。它的主要目标是帮助开发者在实现服务定位器模式时,提供一个清晰且可扩展的框架。服务定位器模式是一种设计模式...

    设计模式-基于C#的工程化实现及扩展

    此外,资料可能还讨论了如何在面向服务(Service-Oriented)或微服务(Microservices)架构中应用设计模式,如服务定位器(Service Locator)和仓储(Repository)模式。在大型项目中,这些模式可以帮助组织复杂的...

    ts-service-locator

    例如,假设您有一个使用logger服务的组件,该组件负责将日志发送到您的后端服务,然后该服务将日志消息存储在数据库中。 在单元测试中,您不希望您的组件实际对后端进行网络调用。 // logger.tsimport axios from ...

    IoC 容器和Dependency Injection 模式

    假设我们需要实现一个 `MovieLister` 类,该类依赖于一个 `MovieFinder` 对象来获取电影列表。在没有 IoC 容器的情况下,`MovieLister` 可能会直接实例化 `MovieFinder`,如下所示: ```java class MovieLister { ...

    服务定位器模式

    3. **统一的服务访问入口**:为应用程序提供一个统一的服务访问入口,简化服务调用逻辑。 #### 三、模式优点 - **性能提升**:通过缓存技术避免重复的JNDI查找操作,显著提高系统响应速度。 - **灵活性增强**:...

    一个简单的MVVMLight显示图书列表的例子

    在图书列表示例中,我们的ViewModel会继承自ViewModelBase,并实现一个包含图书集合的属性,当这个属性的值改变时,UI会自动更新。 2. Messenger:这是一个消息传递机制,允许不同部分的代码之间进行通信,而无需...

    二十三种设计模式【PDF版】

    整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增强灵活性. 建筑和软件中模式之异同 CSDN 的透明特别推崇《建筑的永恒之道》,认为从中探寻到软件的永恒之道,并就"设计模式"写了专门...

    设计模式.docx

    该模式通过创建一个新的适配器类来包装原有类,实现接口间的转换。 #### 桥接模式(Bridge Pattern) 桥接模式将抽象部分与其实现部分分离,使它们都可以独立地变化。这种模式适用于当一个类的行为和属性都需要...

Global site tag (gtag.js) - Google Analytics