服务器定位模式——配合注解实现
来源:互联网 发布:微信公众平台asp源码 编辑:程序博客网 时间:2024/05/22 18:55
服务器定位模式——配合注解实现
本文主要介绍如何使用注解实现服务器定位模式。
本文主要参考:http://www.runoob.com/design-pattern/service-locator-pattern.html
服务器定位模式的使用场景:当有多个服务实现类需要根据需要进行分别调用时使用。
我们在使用CalServiceImpl2和CalServiceImpl1时,正常情况下会使用这样的方式。
CalService calService = new CalServiceImpl1();
CalService calService = new CalServiceImpl2();
现在要说的是使用服务器定位模式来实现调用。
下面是使用服务器定位模式的类图:
具体实现:
package com.xueyou.demo.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Provider { String value() default "";}
package com.xueyou.demo.locator;import com.xueyou.demo.service.CalService;import com.xueyou.demo.serviceImpl.CalServiceImpl1;import com.xueyou.demo.serviceImpl.CalServiceImpl2;public class CalServiceLocator { private static CalServiceLocator calServiceLocator; private CalServiceLocator() { } public static CalServiceLocator getInstance() { if (calServiceLocator != null) { return calServiceLocator; } return new CalServiceLocator(); } public CalService getService(String serviceName) { CalService calService; if (serviceName.equals("serviceImpl1")) { calService = new CalServiceImpl1(); } else if (serviceName.equals("serviceImpl2")) { calService = new CalServiceImpl2(); } else { calService = null; } return calService; }}
package com.xueyou.demo.locator;import com.xueyou.demo.service.CalService;import com.xueyou.demo.serviceImpl.CalServiceImpl1;import com.xueyou.demo.serviceImpl.CalServiceImpl2;import com.xueyou.demo.serviceImpl.DefaultCalServiceImpl;import sun.security.jca.GetInstance;import java.util.HashMap;import java.util.Map;public class CalServiceLocator2 { private static CalServiceLocator2 calServiceLocator2; private static Map<String, CalService> map = new HashMap<>(); private CalServiceLocator2() { } public static CalServiceLocator2 getInstance() { if (calServiceLocator2 != null) { return calServiceLocator2; } calServiceLocator2 = new CalServiceLocator2(); return calServiceLocator2; } public void register(String code, CalService calService) { if (!map.containsKey(code)) { map.put(code, calService); } } public CalService getService(String code) { if (map.containsKey(code)) { return map.get(code); } return null; } public void showCache() { System.out.println("cache 情况 --begin"); for (String s : map.keySet()) { System.out.println(s + ":" + map.get(s)); } System.out.println("cache 情况 --end"); } public void init(){ new DefaultCalServiceImpl(); new CalServiceImpl1(); new CalServiceImpl2(); System.out.println("service init ......"); }}
package com.xueyou.demo.service;public interface CalService { public void say();}
package com.xueyou.demo.serviceImpl;import com.xueyou.demo.annotation.Provider;import com.xueyou.demo.locator.CalServiceLocator2;import com.xueyou.demo.service.CalService;@Provider("default")public class DefaultCalServiceImpl implements CalService { public DefaultCalServiceImpl() { Provider provider = this.getClass().getAnnotation(Provider.class); String code = provider.value(); CalServiceLocator2.getInstance().register(code, this); } @Override public void say() { System.out.println(this); System.out.println("this is " + this.getClass().getName()); }}
package com.xueyou.demo.serviceImpl;import com.xueyou.demo.annotation.Provider;@Provider(value = "service1")public class CalServiceImpl1 extends DefaultCalServiceImpl { @Override public void say() { System.out.println(this); System.out.println("this is " + this.getClass().getName()); }}
package com.xueyou.demo.serviceImpl;import com.xueyou.demo.annotation.Provider;@Provider("service2")public class CalServiceImpl2 extends DefaultCalServiceImpl{ @Override public void say() { System.out.println(this); System.out.println("this is " + this.getClass().getName()); }}
package com.xueyou.demo;import com.xueyou.demo.annotation.Provider;import com.xueyou.demo.locator.CalServiceLocator;import com.xueyou.demo.locator.CalServiceLocator2;import com.xueyou.demo.service.CalService;import com.xueyou.demo.serviceImpl.CalServiceImpl1;import com.xueyou.demo.serviceImpl.CalServiceImpl2;import com.xueyou.demo.serviceImpl.DefaultCalServiceImpl;import java.lang.reflect.Field;/** * Hello world! */public class App { public static void main(String[] args) { CalServiceLocator2 serviceLocator2 = CalServiceLocator2.getInstance(); serviceLocator2.showCache(); serviceLocator2.init(); serviceLocator2.showCache(); CalService calService = serviceLocator2.getService("service1"); calService.say(); CalService calService1 = serviceLocator2.getService("service2"); calService1.say(); }}
运行结果:
阅读全文
0 0
- 服务器定位模式——配合注解实现
- 浅谈简单工作流设计——责任链模式配合策略与命令模式的实现
- Ajax——使用html配合php实现文件上传到服务器
- 服务器定位模式(ServiceLocator)
- “服务器推”之Iframe配合comet实现
- IAP实现之一服务器模式 — cocos2dx
- Vim编译器配合ctags实现函数原型快速定位
- Spring中的@ControllerAdvice注解配合@ExceptionHandler使用实现异常处理
- Spring中@ControllerAdvice注解配合@ExceptionHandler实现统一异常处理
- CSS——定位模式
- 定位的配合使用
- 解析动态代理模式与跟自定义注解配合使用以及事务注解原理
- Java Service Locator Pattern(服务器定位模式)
- spring注解模式的实现
- Vim编译器配合ctags实现函数原型快速定位方法介绍
- PostConstruct 注解 配合 spring注解使用
- 5、@Async注解配合@EnableAsync注解使用
- 设计模式【服务器定位模式Service Locator Pattern】
- 什么是机器学习
- SpringBoot安全
- 刷机!刷机!!刷机!!!
- Sinox下的Wow
- [架构师之路]WEB开发中的MAVEN 镜像
- 服务器定位模式——配合注解实现
- 行为医学统一
- Providing vertex data to vertex programs //为顶点程序提供顶点数据
- POJ 2631 Roads in the North 笔记
- WMS系统开发总结-出库拣货-复核功能开发
- Git 版本管理
- 特征选择常用算法综述
- Spring 学习一
- POJ 2632 Crashing Robots 笔记