架构探险-从零开始写Javaweb框架读书笔记(3)

时间:2021-10-19 13:13:13

实现依赖注入功能

spring @Autowired注解

在学习spring框架的时候,我们可以通过xml的方式注入属性也可以通过注解的方式注入属性。

 @Service
Class ServiceBean{
}

@Controller
Class ControllerBean{
@Autowired
private ServiceBean service;
}

那么serviceBean就注入到了controllerBean中
现在我们的需求就是通过自己的框架实现这种注入方式

  1. 先遍历上一节我们获取到的class-bean的映射
  2. 获取每一个带有注解@inject的属性
  3. 根据类型查找实例对象注入属性
/**
* Created by xueaohui on 2016/6/22.
*/

public class IocHelpter {

static {
//获取所有的 Bean类 与 Bean实例 之间的映射关系(简称Bean Map)
Map<Class<?>,Object> beanMap = BeanHelper.getBeanMap();

if(CollectionUtil.isNotEmpty(beanMap)){
for(Map.Entry<Class<?>,Object>beanEntry : beanMap.entrySet()){
//从 BeanMap 获取Bean类的实例
Class<?>beanClass = beanEntry.getKey();
Object beanInstance = beanEntry.getValue();

Field[] beanFields = beanClass.getDeclaredFields();

if(ArrayUtil.isNotEmpty(beanFields)){

for(Field beanField : beanFields){
//判断是否带有 Inject 的注解
if(beanField.isAnnotationPresent(Inject.class)){
//在映射中 获取 BeanField 实例
Class<?> beanFieldClass = beanField.getType();
Object beanFieldInstance = beanMap.get(beanFieldClass);

if(beanFieldInstance != null){
//反射 初始化beanField的实例
ReflectionUtil.setField(beanInstance,beanField,beanFieldInstance);
}
}

}
}
}
}
}

}

顺便提一下这个@Service @Controller @Repository @Component
前三个与Component是等效的
但是他们与web程序中的
控制层 ( @Controller )
业务层 (@Service )
持久层 ( @Repository )
分别对应,增加代码的可读性