← 返回文章列表

oa-backend-framework项目架构设计 - IoC容器

分类:计算机/架构/oa-backend-framework项目架构设计

IoC容器+依赖注入大大降低了对象间依赖管理的复杂性,给Java开发带来了极大的便利。我们的应用同样遵循这个设计思想。

考察OA系统中可能可用的IoC容器,发现都不适合我们:

其实我们需要的特性很简单:

因此,我们自己实现IoC容器。

Component注解:具有此注解的具体类(非抽象类)将会作为Bean管理。

IoCContainer类:

  1. 使用Map<Class<?>, Object> beanMap保存每个类对应的Bean实例。
  2. 使用Hutool(在OA系统的三方库中)的ClassScanner扫描应用的包,对每个带有@Component注解的具体类,调用registerBean()注册Bean实例。
  3. registerBean(Class<?> clazz)方法:先检查clazzbeanMap中是否存在,存在则不重复注册。不存在,则调用clazz的无参构造器创建Bean实例,并保存到beanMap中,然后调用injectDependencies()注入依赖。注意:这里要先保存到beanMap,再注入依赖,否则在循环依赖、自身依赖的场景下会无限递归。
  4. injectDependencies(Object object)方法:遍历object所在类及所有祖先类的实例属性,如果属性有@Resource注解,且属性值为null,则按属性的类型获取Bean实例,并设置为属性值。如果该类型对应的Bean实例不存在,则先调用registerBean()注册之。

应用启动时,会调用IoCContainer扫描、注册Bean实例,并注入依赖,完成IoC容器的初始化。