`
liwenshui322
  • 浏览: 511264 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA 服务提供者框架介绍

 
阅读更多

      服务提供者框架是指:多个服务提供者实现一个服务,系统为客户端提供多个实现,并把他们从多个实现中解耦出来。服务提供者的改变对它们的客户端是透明的,这样提供了更好的可扩展性。例如,JDBC,JMS等就是用了服务提供者框架

      他们之间的关系如下图:

  


 
 

   1.服务具体实现类和服务提供者实现类是服务提供者自己去实现。以JDBC为例,这2个模块由具体的数据库提供商来实现。

   2.其他三个模块是java对数据库提供商怎么实现上面2个模块的一个约束。比如:提供服务者实现类必须实现服务提供者接口。才能成功注册到服务提供者注册类。以JDBC为例,所有的数据库提供商只需要按照接口里面定义的规则来操作,都能成功地使java连上他们的数据库。

 

    下面以mysql数据库为例简单说明一下mysql数据库提供商是如何实现这些接口的。

    1.我们在java中获取mysql连接对象源代码如下:

 

   

Class.forName("com.mysql.jdbc.Driver"); 
DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123");

 

 

 

       从这个地方可以看出:我们只需要更换数据库的驱动名称与建立连接的URL,用户名等信息,就可以完全切换到另外一个数据库。数据库底部怎么操作的我们不清楚,也没必要清楚。我们获取的连接对象是Connection,查看java.sql.Connection这个类,会发现它只是一个接口。我们得到的只是一个接口,怎么可能能够操作数据库呢?其实这里得到的不是Connection接口,而是它的一个实现类,只是对于客户端不可见而已。这可能就是所谓的面向接口编程,客户端只需要知道它该知道的信息,服务端告诉客户端,你可以调用哪些方法。至于具体方法怎么实现是服务端的事情,客服端就不需要管,也不需要知道了。

     下面我们看看简单的这2个语句分别做了什么事情:

      语句一: Class.forName("...")。这样一个语句会实例化一个com.mysql.jdbc.Driver类(提供服务者实现类),并将这个类的实例注册到DriverManager(服务提供者注册类)。

       语句二: 通过建立连接的URL,用户名,密码来获取建立到mysql数据库的连接。是这样的,DriverManager通过你传进来的url信息判断出你是要获取那个服务提供者提供的服务。也就是语句一已经将提供服务者实现类注册到DriverManager了,DriverManager获取到这个服务提供者实现类对象之后,通过调用它的getService(mysql里面是connect方法)方法获取到服务具体实现类对象,返回的却是java.sql.Connection接口对象(因为服务具体实现类实现了Connection接口),这样把服务具体实现类对象隐藏了。提供了很好的扩展性。

      最后,我们自己来测试一个。

      以北京地铁进出控制为例:现在北京地铁进出都是刷卡,有二种卡:1.一卡通(比如一次性冲值50元,进地铁刷一次,出地铁刷一次,扣2元)。2.一次性卡(进地铁刷一次,出地铁插入回收。)这2种卡都可以实现进出地铁功能,但实现的具体方法是有区别的:一卡通:需要获取这卡余额是多少,然后扣掉2元。如果余额不足2元怎么处理等。一次性卡则没必要了。

     服务接口源码:

 

   

/**
 * 进出地铁服务接口
 * @author Administrator
 *
 */
public interface SubWayInterface {
	
	//进入地铁
	public boolean in();
	
	//出地铁
	public boolean out();

}

 

 

   

   服务实现源码:

 

 

/**
 * 一卡通地铁进出服务实现
 * @author Administrator
 *
 */
public class SubWayImpl implements SubWayInterface {

	public boolean in() {
		System.out.println("通过一卡通进入地铁");
		/**
		 * 进行一些处理,然后返回是否放行
		 */
		return false;
	}

	public boolean out() {
		System.out.println("通过一卡通出地铁");
		/**
		 * 进行一些处理,然后返回是否放行
		 */
		return false;
	}

}

 

 

    

   服务提供者接口源码:

 

 

  

/**
 * 地铁进出服务提供者接口
 * @author Administrator
 *
 */
public interface SubwayProviderInterface {
	
	public SubWayInterface getService();

}

 

 

    服务提供者接口实现源码:

 

 

   

/**
 * 服务提供者实现类
 * @author Administrator
 *
 */
public class SubwayProviderImpl implements SubwayProviderInterface {

	static {
		ServiceManager.registerProvider("一卡通", new SubwayProviderImpl());
	}

	public SubWayInterface getService() {
		return new SubWayImpl();
	}

}

  

 

   服务提供者注册类实现源码:

 

 

  

/**
 * 服务提供者注册类
 * 
 * @author Administrator
 * 
 */
public class ServiceManager {

	private ServiceManager() {

	}

	private static final Map<String, SubwayProviderInterface> providers = new ConcurrentHashMap<String, SubwayProviderInterface>();

	public static void registerProvider(String name, SubwayProviderInterface p) {
		providers.put(name, p);
	}

	public static SubWayInterface getService(String name) {

		SubwayProviderInterface p = providers.get(name);

		if (p == null) {
			throw new IllegalArgumentException(
					"No provider registered with name:" + name);
		}

		return p.getService();

	}

}

  

 

     客户端测试类:

 

    

/**
 * 客户端测试类
 * @author Administrator
 *
 */
public class Test {

	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		
		Class.forName("cn.netjava.cgl.subway.SubwayProviderImpl");
		SubWayInterface swi = ServiceManager.getService("一卡通");
		swi.in();
		swi.out();
	}
}

 

   测试类Class.forName("")里面的参数你可能跟我的不同,看你服务提供者实现类放在哪个包下面了。我的是在:cn.netjava.cgl.subway包下面。

 

 

 

    

  • 大小: 66.5 KB
  • 大小: 62 KB
5
1
分享到:
评论
2 楼 iocaop 2016-08-15  
不错,写的很清晰易懂
1 楼 lord_is_layuping 2011-11-25  

相关推荐

    java三大框架

    框架说白了就是JAVA工作者多年以来总结出的一些开发标准。让我们可以以成功的经验模式来开发我们自已的系统,一般使用框架的好处是 ·在好的框架下,开发者只需要写一些必须的代码;他们不需要直接接触底层的API。 ...

    Java EE常用框架.xmind

    Java EE常用框架 WebService 介绍 基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用 术语 XML. Extensible Markup Language -扩展性标记语言 WSDL – ...

    JAVA_API1.6文档(中文)

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供...

    Java 1.6 API 中文 New

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者...

    Java项目源码基于ssm框架及java web的防疫工作志愿者服务平台的设计与实现+jsp.rar

    防疫工作志愿者服务平台是一个基于Java的志愿者管理平台,采用SSM(Spring + Spring MVC + MyBatis)框架实现后端逻辑,并结合JSP(JavaServer Pages)技术构建前端页面。该平台旨在为社区防疫工作提供志愿者招募、...

    grpc-nebula-java:微服务治理框架Java实现

    提供多种形式的服务访问控制策略,能够根据设定的安全策略对调用者进行安全检查,支持黑白名单等安全机制。 服务调用异常处理。当一个服务有多个服务器实例时,如果客户端调用A服务器连续多次出错,框架会自动将了...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包3

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java开源包11

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包6

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java api最新7.0

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者...

    java开源包9

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包4

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java开源包101

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包5

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JavaAPI1.6中文chm文档 part1

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供...

    java开源包8

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包10

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

Global site tag (gtag.js) - Google Analytics