1.引入:静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以并不存在,这种灵活的静态工厂方法构成了服务提供者框架的基础。——引自effectivejava item one
2.说明:服务提供者框架是指这样的一个系统:提供者为框架的用户提供了多个API实现,框架必须提供一种机制来注册这些实现以便用户能够使用它们。框架的客户直接使用API,无需关心自己到底在使用哪个实现。
3.简单的服务提供者框架的例子:
import java.util.HashMap;
import java.util.Map;
class DefaultFoo extends Foo {
}
public abstract class Foo {
//注册实现类的集合
private static Map<String, Class> implementations;
static {
//初始化实现类集合
initMapIfNecessary();
}
private static void initMapIfNecessary(){
if(implementations == null){
implementations = new HashMap<String, Class>();
//以下从配置文件加载实现类映射以初始化注册实现类的集合 省略之。。
}
}
//获取对象实例
public static Foo getInstance(String key){
Class c = implementations.get(key);
if(c == null)
return new DefaultFoo();
try {
return (Foo) c.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
说明:通过编辑一个配置文件,加入一个条目,把一个字符串映到对应的类名,以此来注册一个实现类,客户使用静态工厂方法时候把字符串键作为参数传递进去。静态工厂方法在一个映射表中查找Class对象,该映射表根据配置文件进行初始化,然后静态工厂方法使用Class.newInstaqnce()方法实例化这个类。
4.JDBC服务提供者框架
====================以下内容引用了edwinljg的文章中内容====================
最近项目要用到JDBC,就深入的学习了一下,所谓深入也只不过就是看了看他的源代码而已。现在想说说自己的感受。
在java.sql.*包中,大部分都是接口,也就所谓的SQL规范。这些接口,都是提供给数据驱动商来进行实现的,这样的好处就是也要知道这些接口的用法,就可以操作不同的数据库了,就也就是规范的作用。里面还有一个类:DriverManager,作为驱动的管理类。通过学习它代码,也就又引出了一个概念那就是服务提供者框架。下面看实例:
/**
* 服务接口。<BR>
*/
public interface Service {
public String read();
public void write(String content);
}
/**
* 服务提供者接口。<BR>
*/
public interface Provider {
public Service getService();
}
/**
* 服务管理类。<BR>
*/
public class ServiceManager {
private ServiceManager() {
}
private static final Map<String, Provider> providers =
new ConcurrentHashMap<String, Provider>();
public static void registerProvider(String name, Provider p) {
providers.put(name, p);
}
public static Service getService(String name) {
Provider p = providers.get(name);
if(p == null) {
throw new IllegalArgumentException("No provider registered with name:" + name);
}
return p.getService();
}
}
/**
* 服务提供者实现。<BR>
*/
public class AdobeProvider implements Provider {
static {
ServiceManager.registerProvider("Adobe", new AdobeProvider());
}
public Service getService() {
return new ServiceImpl();
}
class ServiceImpl implements Service {
public String read(){
System.out.println("Adobe read...");
return "";
}
public void write(String content) {
System.out.println("Adobe write...");
}
}
}
/**
* 测试用类。<BR>
*/
public class Test {
public static void main(String []args) throws Exception {
Class.forName("AdobeProvider");
//Class.forName("MicrosoftProvider");
//Class.forName("MacProvider");
Service service = ServiceManager.getService("Adobe");
//Service service = ServiceManager.getService("Microsoft");
//Service service = ServiceManager.getService("Mac");
service.read();
service.write("title");
}
}
看看测试类里面的调用,是不是和使用JDBC时有点像哈。通过注册不同的实现,来改变使用具体服务时候的底层操作,也就是说隐藏了具体实现。而作为服务使用者呢,这要知道提供的这些服务就好了。上面只是一个简单的实现,想更加深入的话,多多研究java的源代码就好了。
分享到:
相关推荐
1. Dubbo服务提供者是Dubbo框架中发布服务的组件,负责处理远程调用。 2. 部署Dubbo服务提供者前,必须先运行Zookeeper,因为它在服务注册和发现过程中起到关键作用。 3. Zookeeper的使用需要在服务提供者的配置中...
《Net SAML2 Service Provider Framework》是一份详尽的文档,旨在介绍和解释.NET环境下的SAML2服务提供者框架的各个方面。该框架是为实现安全、标准化的身份验证与授权机制而设计的,特别适用于跨组织或跨域的用户...
【标题】"Dubbo服务提供者的Web应用实例"是一个典型的分布式服务架构中的示例,它展示了如何将一个Java Web应用程序转化为服务提供者,利用Apache Dubbo框架对外提供服务。Dubbo是一个高性能、轻量级的开源Java RPC...
Proxy Client负责服务调用,Server Transport负责服务提供者和服务消费者之间的通信。Invoker Interface是服务提供者的接口。 技术选型 JSF采用了多种技术来实现高性能和可扩展性,包括NIO、TCP长连接、IO-...
标题中的“修改后的dubbo服务提供者实例”指的是一个经过定制或优化的Dubbo服务提供者项目,这个项目被设计成一个普通的Java工程,能够方便地通过Maven打包并集成到消费者工程中。Dubbo是一个高性能、轻量级的开源...
1. 服务提供者(Provider):提供服务的实体,通过Dubbo可以将服务暴露出来,使得其他服务能够调用。 2. 服务消费者(Consumer):消费服务的实体,通过Dubbo调用服务提供者提供的服务。 3. 服务注册中心...
1. **创建服务提供者**: 创建一个实现了特定接口的Java服务类,这是服务的核心业务逻辑。 2. **配置服务元数据**: 在Spring配置文件中,定义服务提供者的bean,包括接口名、实现类、版本号等信息。 3. **启动服务...
服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外 注册中心通过...
服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果有变更,注册...
文件列表中的“Actor Framework 实际应用.pdf”很可能是对操作者框架的理论介绍和实践指导,包含了如何在具体项目中引入和使用操作者框架的步骤。而“附件”可能包含了与PDF文档相关的源代码或补充材料。“[Project ...
这涉及到服务注册与发现,使得服务提供者能够向注册中心注册自己的服务,而服务消费者可以通过查找注册中心获取到服务提供者的地址。此外,负载均衡策略也是必不可少的,例如轮询、随机、最少连接数等,这些策略可以...
在RPC框架中,服务提供者通过监听特定端口的Socket,等待服务消费者的请求。服务消费者通过Socket连接到服务提供者的地址和端口,发送请求,并接收响应。 Java动态代理是Java语言提供的一种机制,允许在运行时创建...
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复 (3) 伸缩性: 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心 服务提供者无状态...
Dubbo提供了服务提供者(Provider)和服务消费者(Consumer)的概念,允许应用之间通过网络进行直接通信。它支持多种协议,如HTTP、RMI、Hessian等,并且可以自定义协议。Dubbo还包含了服务的注册与发现机制,使得...
此外,JSF支持HA(高可用性)和负载均衡,确保服务消费者通过算法选择多个服务提供者实例时,可进行健康监测和重试机制配置。 为了提升性能,JSF框架采取了包括批量处理请求、优化线程模型、启用压缩算法、定制序列...
在IT行业中,尤其是在分布式系统和微服务架构领域,服务提供者和服务消费者之间的高效通信是至关重要的。"GroupCo基础服务提供者,java版本"显然是一款专门为GroupCo设计的基础服务组件,它采用Java语言进行开发,...
通过Spring的IOC(Inversion of Control)容器,服务提供者可以在启动时自动注册服务,而服务消费者可以通过服务ID和服务接口从ServiceRepository中获取服务代理,从而实现远程调用。 总结来说,远程调用服务框架是...
5. **错误处理**:确保框架能够优雅地处理异常和错误,提供有意义的错误信息,并保持服务的稳定性。 6. **模板引擎**:对于动态生成HTML,我们需要一个模板引擎,如Boost.Spirit或外部库如Handlebars,以便将数据和...
分布式服务框架 dubbo/dubbox 入门示例 1.透明化的远程方法调用,就像调用...3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
Dubbo 的核心设计理念是“面向接口的编程”,使得服务提供者和消费者之间通过接口进行解耦,提高了系统的灵活性和可扩展性。 1. **服务提供者(Provider)**:服务提供者是实际提供服务的应用,它将服务注册到注册...