public interface Service1 { void execute(); } public class Service1Impl implements Service1 { private Service2 service2; public Service1Impl(Service2 service2) { this.service2 = service2; } @Override public void execute() { System.out.println("Service1 is doing something."); service2.execute(); } } public interface Service2 { void execute(); } public class Service2Impl implements Service2 { @Override public void execute() { System.out.println("Service2 is doing something."); } } // 工厂类的实现 public class Service2Factory { public static Service2 getService2Instance() { return new Service2Impl(); } } public class Service1Factory { public static Service1 getService1Instance() { Service2 service2 = Service2Factory.getService2Instance(); return new Service1Impl(service2); } } // 测试代码 public class Client { public void doSomething() { Service1 service = Service1Factory.getService1Instance(); service.execute(); } } -- Service1 is doing something. -- Service2 is doing something.
//简单的服务定位器 public class ServiceLocator { private static ServiceLocator locator; // 建立 HashMap<String, Object>对象来持有这些服务对象 private Map<String, Object> services = new HashMap<String, Object>(); // 初始化容器 public static void configure() { load(new ServiceLocator()); // Service一、Service2的对象实际上是按照单例建立的 Service2 service2 = new Service2Impl(); locator.services.put("service2", service2); Service1 service1 = new Service1Impl(service2); locator.services.put("service1", service1); } private static void load(ServiceLocator serviceLocator) { locator = serviceLocator; } public static Object lookup(String serviceName) { return locator.services.get(serviceName); } public static void registerService(String name, Object service) { locator.services.put(name, service); } }
public class Client { public void doSomething() { Service1 service1 = (Service1) ServiceLocator.lookup("service1"); service1.execute(); } // 测试代码 public static void main(String[] args) { // 初始化容器 ServiceLocator.configure(); new Client().doSomething(); } }
// ServiceAware 接口 public interface ServiceAware { void injectService(Service service); } // Service 接口及其实现类 public interface Service { void excute(); } public class ServiceImpl implements Service { @Override public void excute() { System.out.println("Service is doing something..."); } } // 建立简单的接口注入容器 public class InterfaceInjector { private static InterfaceInjector injector; private Map<Class, Object> services = new HashMap<Class, Object>(); // 安装容器 public static void configure() { load(new InterfaceInjector()); } public static <T> T getInstance(Class<T> clazz) { return injector.loadService(clazz); } private static void load(InterfaceInjector container) { InterfaceInjector.injector = container; } private <T> T loadService(Class<T> clazz) { Object service = injector.services.get(clazz); if (service != null) { return (T) service; } try { // 建立 clazz类实例 service = clazz.newInstance(); // 经过接口装配依赖的对象,若是对象是 ServiceAware的实例为真 if (service instanceof ServiceAware) { // 则调用此接口的方法注入 ServiceAware对象 ((ServiceAware) service).injectService(new ServiceImpl()); } injector.services.put(clazz, service); } catch (Exception e) { e.printStackTrace(); } return (T) service; } } // 只要服务类实现这个接口,容器就会注入 Service对象,定义一个 Client类实现该接口 public class Client implements ServiceAware { private Service service; @Override public void injectService(Service service) { this.service = service; } public void doSomething() { service.excute(); } public static void main(String[] args) { InterfaceInjector.configure(); Client client = InterfaceInjector.getInstance(Client.class); client.doSomething(); } } -- Service is doing something...
//参数注入 public class Client { // 外部程序经过函数参数,给客户程序注入所依赖的服务对象 // 采用外部传递 Service对象方式,至于Service如何实例化,它一无所知 public void dosomething(Service service) { service.excute(); } // 使用方法:外部程序实例化一个 Service实例,传递给 Client的 dosomething(Service service)方法使用 public static void main(String[] args) { Service service = new ServiceImpl(); new Client().dosomething(service); } }