申明:本人对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内容如下:
先建立一个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
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
重要的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内容如下:
测试类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
好了整个流程就是这样,是不是很简单@@@@。
下面是大家喜欢的源代码下载:::::
ServiceLocator.zip
事先要求安装maven,安装maven请google一下。。
在service.learn目录下执行命令mvn clean install -Dmaven.test.skip
这样测试的工程test.servicelocator就能跑了,请导入eclipse后调试。