Java服务提供_effective java笔记之java服务提供者框架

博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自学了很多流行的技术(我差点信了),也重拾了之前忽略的数据结构和算法(虽然还是半吊子,总比一点不会好,哈哈),欢迎大家和我交流,特别是想提升自身技能的小伙伴,我的QQ是673793576,下面开始进入正题~~

以前我看书的时候都是走马观花的看,看完以为都懂了,其实毛都不会,纯属浪费时间,最近在看2本书,effective java 和 java 并发编程实战,两本书绝对是难得的好书,强烈推荐大家去仔细精读,前提是有java基础,不放过书中提到的每一个知识点,不好意思,又写了一段与正题无关的内容,哈哈。。。。

服务提供者框架其实我们并不陌生,从最开始的jdbc编程中,我们就已经遇见了它,常用的数据库有MySQL数据库,Oracle数据库等,这些数据库由于是不同的数据库提供方提供,导致在java连接数据库的连接方式也不一样,这里我们可以把这个连接看成一个服务,作为开发人员,我们只管去调用这个服务,而不需要管这个服务是怎么产生的,服务的生成由这些服务提供者去产生,我们要做的就是指定一个服务提供者的名字,然后就可以得到服务,而无需关注具体实现细节,那么问题来了,我们要获取服务,从哪里获取,直接向服务提供者索要吗?通常的做法是,用一个类似管家的东西来集中管理这些服务的提供者,作为服务消费方,我们直接去找这个管家索要服务

服务提供者框架的几个概念:服务接口以及具体的服务实现类,服务提供者接口(可选)以及具体的实现类,服务提供者的注册类(也就是上文所说的管家)

服务是一个很抽象的概念,既然是服务,它肯定有个作用啊,对应到java中,它应该具有方法,事实上,服务的种类有很多,学过java的都知道,我们可以用一个接口来定义一个服务,然后让不同的实现类去实现这个接口从而实现具体的服务内容。

服务接口:定义了抽象的服务,以及一个或多个方法

服务实现类:实现服务接口,实现具体的方法

服务提供者接口:定义了抽象的服务提供者,提供一个获取服务的方法

服务提供者实现类:实现服务提供者接口,实现具体的方法

服务提供者注册类:提供一个注册服务与调用服务的方法,它是面向服务消费者的

废话不说直接上图

bbfacb9b25ca47ae06d9a356e73112c9.png

接着上代码

1 packageserviceprovider;2

3 public interfaceService {4

5 voidprint();6 }

packageserviceprovider;public class FirstService implementsService {

@Overridepublic voidprint() {

System.out.println("第一个服务");

}

}

packageserviceprovider;public class SecondService implementsService {

@Overridepublic voidprint() {

System.out.println("第二个服务");

}

}

packageserviceprovider;public interfaceServiceProvider {

Service getService();

}

packageserviceprovider;public class FirstServiceProvider implementsServiceProvider {static{

ServiceManager.registerProvider("firstServiceProvider", newFirstServiceProvider());

}

@OverridepublicService getService() {return newFirstService();

}

}

packageserviceprovider;public class SecondServiceProvider implementsServiceProvider {static{

ServiceManager.registerProvider("secondServiceProvider", newSecondServiceProvider());

}

@OverridepublicService getService() {return newSecondService();

}

}

packageserviceprovider;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;public classServiceManager {private static final Map providers = new ConcurrentHashMap();public static voidregisterProvider(String name, ServiceProvider p) {

providers.put(name, p);

}public staticService getService(String name) {

ServiceProvider p=providers.get(name);if (p == null) {throw newIllegalArgumentException("No ServiceProvider registered with name:" +name);

}returnp.getService();

}

}

packageserviceprovider;public classTest {public static void main(String[] args) throwsClassNotFoundException {

Class.forName("serviceprovider.FirstServiceProvider");

Service service= ServiceManager.getService("firstServiceProvider");

service.print();

}

}

执行结果:第二个服务

代码分析:首先定义一个名叫Service的服务,这里只提供一个print()方法,它有两个具体的实现类,第一个实现类的print方法打印出“第一个服务”内容,第二个同理,现在有了服务,还缺服务的提供者,也就是这些服务由谁来提供,同理定义一个提供者接口,既然是服务提供者,总得存在服务吧,没有服务尼玛还提供毛线啊,所以要持有一个取得服务的方法,这里用到了一个静态代码块,是为了提供者在类在初始化时向管理类注册自己,意思就是,管家(提供者管理类),我是XX,我提供XX服务,给我登记一下我的信息。第二个同理。然后来一个测试类,这里看到Class.forName是不是很熟悉,Class.forName("xxx"),会加载这个类的信息,并初始化静态代码块,因为静态对象属于类嘛,但是不会实例化这个对象,除非加上.newInstance()方法,即Class.forName("xxx").newInstance();这里用的是反射,就不细说了。所以在提供者类中用静态代码块想管理类注册自己(这样只需要Class.forName("xxx")就可以执行xxx里的静态内容了,对应到提供者类中就是实例化自身,放在管理类的map中去管理),还有一个管理类,作为服务调用方,主要就和这个管理类打交道,这个类用了一个ConcurrentHashMap集合来维护这些提供者信息,ConcurrentHashMap是一个线程安全的map,具体请自行百度,当有服务提供者注册时就put一个进去,当有调用方调用服务时就get一个出来,也就是key value的操作。

很简单吧~

再看看jdbc是怎么操作的。

Class.forName("com.mysql.jdbc.Driver");

这里的Driver就是我们的提供者类。负责提供Connection(服务)的

Connection connection= DriverManager.getConnection("jdbc:mysql:///xxx", "root", "root");

这里的DriverManager对应提供者管理类,它对外提供一个获取服务(也就是Connection)的方法。

jdbc:mysql说明这个服务提供者是MySQL的,那么从集合(这里用的不是map,是一种list数组集合,可以看看DriverManager类的源码)里取出实现MySQL数据库连接的服务提供者,调用服务提供者的获取服务方法(前文说过,服务提供者肯定有一个获取服务的方法),然后返回我们需要的服务,也就是Connection对象

完~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值