本系列文章介绍ByxContainer的实现思路。 ByxContainer是一个简单的轻量级IOC容器,具有以下特性:
ByxContainer的设计借鉴了ajoo大神的博客。 项目地址:github 码云 本篇文章介绍ByxContainer中的核心概念、接口和类。 组件(Component)ByxContainer使用组件(Component)来管理系统中的所有对象。组件代表了系统中的一个对象,并封装了该对象的创建过程。下面是 public interface Component { Object create(); } 假设类 public class A { private final String msg; private final int val; public A(String msg, int val) { this.msg = msg; this.val = val; } ... } 如果我们希望按照如下方式创建一个 A a = new A("hello", 123); 那么,可以写如下 public class AComponent implements Component { @Override public Object create() { return new A("hello", 123); } }
A a = (A) new AComponent().create(); 那么,这种方式与前面直接new的方式相比,有什么优势呢?主要有两点:
容器(Container)容器(Container)是一个对象工厂, public interface Container { void addComponent(String id, Component component); <T> T getComponent(String id); } 容器里面的每个组件都使用id唯一标识。 ByxContainer实现类
public class ByxContainer implements Container { private final Map<String, Component> components = new ConcurrentHashMap<>(); @Override public void addComponent(String id, Component component) { components.put(id, component); } @Override @SuppressWarnings("unchecked") public <T> T getComponent(String id) { return (T) components.get(id).create(); } }
ContainerFactory接口有时候,我们希望从不同的地方(如配置文件、注解)读取容器配置,并初始化容器,所以需要抽象出一个 public interface ContainerFactory { Container create(); } ByxContainer中已经实现了一个 // 初始化容器 InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("container.json"); ContainerFactory factory = new JsonContainerFactory(inputStream); Container container = factory.create(); // 使用容器 SomeType myObject = container.getComponent("myObject"); 在接下来的文章中不会介绍与配置文件解析有关的内容,而只会介绍支持将配置文件翻译成ByxContainer组件定义的基础设施。 使用ByxContainer实际上,有了上面介绍的这几个接口和类,我们就能把这个IOC容器用起来了,具体使用步骤如下:
这样使用虽然能完成需求,但是非常不方便,因为对每个不同的对象,都需要创建一个不同的实现类。有没有一种方法,能够无需实现任何子类就能定义不同对象的创建方式呢? |
|