对类的实例化,不是开发者自己通过new的方式来实例化,而是通过框架自身来实例化,这过程称为IoC。控制不是由开发者来决定的,而是反转给框架了。一般地,我们也将控制反转称为DI(Dependency Injection,依赖注入)。那如何实现呢?
最简单的方式是,先通过BeanHelper获取所有Bean Map(是一个Map<Class<?>,Object> 结构,纪录了类与对象的映射关系,
分别取出Bean类与Bean实例 ,进而通过反射获取类中所有的成员变量。继续遍历这些成员变量,在循环中判断当前成员变量是否带有Inject注解,若带有该注解,则从Bean Map中根据Bean类取出Bean实例。最后通过ReflectionUtil#setField方法来修改当前成员变量的值。
核心实现:
Map<Class<?>,Object> beanMap = BeanHelper.getBeanMap(); if (CollectionUtil.isNotEmpty(beanMap)) { for (Map.Entry<Class<?>,Object> beanEntry : beanMap.entrySet()) { Class<?> beanClass = beanEntry.getKey(); Object beanInstance = beanEntry.getValue(); Field[] beanFields = beanClass.getDeclaredFields(); if (ArrayUtil.isNotEmpty(beanFields)) { for (Field beanField : beanFields) { if (beanField.isAnnotationPresent(Inject.class)) { Class<?> beanFieldClass = beanField.getType(); Object beanFieldInstance = beanMap.get(beanFieldClass); if (beanFieldInstance != null) { ReflectionUtil.setField(beanInstance,beanField,beanFieldInstance); } } } } } }
更多架构底层实现代码请移步
https://github.com/edagarli/own_framework
原文地址:https://www.jb51.cc/javaschema/284190.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。