使用service locator快速定位你的服务

申明:本人对java了解不太深,发表的观点可能有不当之处,如有之请不吝赐教。

service locator模式在老早的j2ee中就被提出来,原因是在一个程序中有大量服务(service)时,使用者调用相关的服务组件就显得不那么容易,既不易寻找,又需要自己创建实例,既耗时又没有任何技术含量。service locator模式的出现解决了上述问题,它将一组服务甚至所有服务交给一个或者若干个service locator,由这些service locator来找寻服务并完成初始化的工作,调用者只需要知道使用哪个service locator即可,这样就大大简化了寻找并实例化服务的工作。

传统的j2ee中的 service locator模式类得调用关系如下图:

但是今天我们不谈j2ee里的service locator,因为自从spring的诞生就意味着java程序在向轻量级框架发展,所以,这里要谈一下如何用spring技术来实现上面的service locator模式。

我们用Spring来实现调用关系如下图(第一次画,画的可能不太对)

此图中ServiceLocator依赖spring容器来生成services,并由一个SpringServiceFactory来管理这些生成的Service,当使用时,只要通过ServiceLocator来查找相应的Service实例.

 

下面来具体介绍如何来写这样一个jar包。

 

先用eclipse建立一个maven工程。

目录结构如下:

 

pom.xml内容如下:

 

4.0.0 com.googlezhang.study.java service.learn 0.0.1-SNAPSHOT ServiceLocator ServiceLocator Study org.springframework spring 2.5.6 org.apache.maven.plugins maven-compiler-plugin 2.3.2 true true 1.6

 

先建立一个do,Person.java 代码如下:

package com.googlezhang.dataobject; public class Person { private Integer age; private String sex; private String name; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

再建立service 和service 实现类

service类GetPersonService,代码如下:

package com.googlezhang.learning.service; import java.util.List; import com.googlezhang.dataobject.Person; public interface GetPersonService { List findPersonByAge(); List findPersonBySex(); List findPersonByName(); }

 

service 实现类GetPersonServiceImpl类代码如下(为了方便,模拟了一些数据):

package com.googlezhang.learning.impl; import java.util.ArrayList; import java.util.List; import com.googlezhang.dataobject.Person; import com.googlezhang.learning.service.GetPersonService; public class GetPersonServiceImpl implements GetPersonService { public List findPersonByAge() { // Simulation query database and return person list. return personListMaker(); } public List findPersonBySex() { // Simulation query database and return person list. return personListMaker(); } public List findPersonByName() { // Simulation query database and return person list. return personListMaker(); } private Person personMaker(Integer age, String sex, String name) { Person person = new Person(); if (null != age) person.setAge(age); if (null != sex) person.setSex(sex); if (null != name) person.setName(name); return person; } private List personListMaker() { List list = new ArrayList(); list.add(personMaker(18, "female", "lucy")); list.add(personMaker(19, "male", "jack")); list.add(personMaker(20, "male", "tom")); return list; } }

 

重要的ServiceLocator类,FindPersonServiceLocator.java代码如下:

package com.googlezhang; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.googlezhang.learning.service.GetPersonService; public class FindPersonServiceLocator { private static ApplicationContext context; private static RuntimeException initException = null; static { try { context = new ClassPathXmlApplicationContext("classpath*:/spring/*Bean.xml"); } catch (RuntimeException e) { // log } } protected static ApplicationContext getApplicationContext() { if (context == null) { throw initException; } return context; } public static GetPersonService getGetPersonService() { return (GetPersonService) context.getBean("getPersonService"); } }

这里要提示注意一点context = new ClassPathXmlApplicationContext("classpath*:/spring/*Bean.xml");

会加载所有jar包下的符合这个路径/spring/*Bean.xml的spring配置文件。如果只想加载本包下,把classpath*的*号去掉。

如下:

context = new ClassPathXmlApplicationContext("classpath:/spring/*Bean.xml");

 

注意servicelocator里面的方法属性都是静态的,还有静态的块,以便初始化。

接下来配置spring配置文件ServiceBean.xml  其内容如下:

 

这样一个maven的jar工程就做好了。

 

下面再新建立一个maven测试的工程:结构如下:

 

 

 

此测试工程pom.xml内容如下:

4.0.0 com.googlezhang.study.startrun test.servicelocator 0.0.1-SNAPSHOT test service locator test service locator org.springframework spring 2.5.6 com.googlezhang.study.java service.learn 0.0.1-SNAPSHOT org.apache.maven.plugins maven-compiler-plugin 2.3.2 true true 1.6

 

测试类ServiceLocatorDemo.java内容如下:

package com.gogolezhang.run.test; import java.util.List; import com.googlezhang.FindPersonServiceLocator; import com.googlezhang.dataobject.Person; import com.googlezhang.learning.service.GetPersonService; public class ServiceLocatorDemo { private static GetPersonService getPersonService = FindPersonServiceLocator.getGetPersonService(); /** * @param args */ public static void main(String[] args) { try { List list = getPersonService.findPersonByAge(); System.out.println(list.size()); } catch (Throwable t) { System.out.println(t); } } }

 

好了整个流程就是这样,是不是很简单@@@@。

下面是大家喜欢的源代码下载:::::

 ServiceLocator.zip

 

事先要求安装maven,安装maven请google一下。。

在service.learn目录下执行命令mvn clean install -Dmaven.test.skip

这样测试的工程test.servicelocator就能跑了,请导入eclipse后调试。

你可能感兴趣的:(企业级java技术文章)