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()); } } }
相关推荐
Service Locator模式的基本思想是,维护一个全局的服务容器,其中存放了所有可用的服务实例。当需要使用某个服务时,只需从容器中查找即可,而无需直接依赖具体的服务实现。这样,我们可以在运行时动态地替换或注入...
总结来说,Autofac的ServiceLocator模式应用结合零配置,使得我们可以更轻松地管理和解耦应用程序中的组件。通过自动扫描、特性注解和模块化,我们可以减少大量手动配置,同时保持代码的清晰和可维护性。在`...
在"11-ServiceLocator-Code.zip"压缩包中的"Code"文件,很可能包含了实现服务定位器模式的示例代码。通过对这些代码的分析,我们可以看到服务定位器是如何工作的,以及它与依赖注入的区别。通过学习这段代码,开发者...
"Android-SimpleLocator"正是一个针对Android平台的轻量级、高效的Service Locator实现,它简化了依赖注入的过程,使得开发者能够更加专注于业务逻辑。 服务定位器(Service Locator)是一种全局性的依赖查找容器,...
ServiceLocator是一个单例模式的类,用于管理和提供对Service的访问。例如: public class ServiceLocator { private static ServiceLocator serviceLocator = null; private BeanFactory factory = null; ...
在本文中,我们将深入探讨Laravel开发中的"locator"项目,这是一个简单的本地路由器。通过理解这个项目,我们可以学习到Laravel框架的核心概念以及如何构建自定义的路由解决方案。首先,让我们了解一下Laravel。 ...
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) ... 服务定位器模式(Service Locator Pattern) 传输对象模式(Transfer Object Pattern) 生产者消费者模式(Producer Consumer Pattern)
Service Locator模式 使用持久性框架 持久性框架策略 小结 第4章 改进性能与伸缩性的设计模式 性能问题的原因 伸缩性问题的原因 城市休假订票应用程序 标识提高性能的模式 标识提高伸缩性的模式 完整City Break...
4. **Service Locator模式**:提供服务发现和定位的功能,简化了组件间的依赖。 5. **Front Controller模式**:作为Web应用的单一入口点,负责请求分发。 6. **Model-View-Controller (MVC)模式**:将业务逻辑、...
面向插件的应用框架具有易于复用和动态...通过一个实例介绍了如何改进Service Locator模式使之更好地管理大量的细粒度短生命周期的插件对象,并展示了采用改进的Service Locator模式来设计面向插件的应用框架的方法。
本文将深入探讨ServiceLocator模式,以及它在.NET中的实现,特别是与C#编程语言的结合。 服务定位器的核心理念是提供一个全局注册表,它存储了所有服务实例或服务接口的映射。当一个类需要依赖其他服务时,它不直接...
JSlim,全称为"Java Service Locator Information Manager",是一个专门针对J2EE应用设计的开源工具。它的主要目标是帮助开发者在实现服务定位器模式时,提供一个清晰且可扩展的框架。服务定位器模式是一种设计模式...
此外,资料可能还讨论了如何在面向服务(Service-Oriented)或微服务(Microservices)架构中应用设计模式,如服务定位器(Service Locator)和仓储(Repository)模式。在大型项目中,这些模式可以帮助组织复杂的...
例如,假设您有一个使用logger服务的组件,该组件负责将日志发送到您的后端服务,然后该服务将日志消息存储在数据库中。 在单元测试中,您不希望您的组件实际对后端进行网络调用。 // logger.tsimport axios from ...
假设我们需要实现一个 `MovieLister` 类,该类依赖于一个 `MovieFinder` 对象来获取电影列表。在没有 IoC 容器的情况下,`MovieLister` 可能会直接实例化 `MovieFinder`,如下所示: ```java class MovieLister { ...
3. **统一的服务访问入口**:为应用程序提供一个统一的服务访问入口,简化服务调用逻辑。 #### 三、模式优点 - **性能提升**:通过缓存技术避免重复的JNDI查找操作,显著提高系统响应速度。 - **灵活性增强**:...
在图书列表示例中,我们的ViewModel会继承自ViewModelBase,并实现一个包含图书集合的属性,当这个属性的值改变时,UI会自动更新。 2. Messenger:这是一个消息传递机制,允许不同部分的代码之间进行通信,而无需...
整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增强灵活性. 建筑和软件中模式之异同 CSDN 的透明特别推崇《建筑的永恒之道》,认为从中探寻到软件的永恒之道,并就"设计模式"写了专门...
该模式通过创建一个新的适配器类来包装原有类,实现接口间的转换。 #### 桥接模式(Bridge Pattern) 桥接模式将抽象部分与其实现部分分离,使它们都可以独立地变化。这种模式适用于当一个类的行为和属性都需要...