依赖注入
首先来了解下Spring框架的核心机制:依赖注入。当某个Java实例(调用者)需要另一个Java实例(被调用者)时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。在依赖注入模式下,创建调用者的工作不再由调用者来完成,因此称为控制反转(Ioc);创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也成为依赖注入(DI)。
Controller中定义Service成员变量,需要通过框架自身来实例化。
首先通过beanContainer获取所有的Bean类全名称和Bean实例,遍历获取所有的Controller类,通过反射获取类中的成员变量,遍历这些成员变量看是否有Autowired注解,若有,从beanContainer中获取Bean实例,然后调用Bean工厂setField()方法将获取的Bean实例赋值给成员变量。
/**
* 依赖注入
*/
public final class IocHelper {
static {
Map<String, Object> beanContainer = BeanContainer.getBeanContainer();
if (CollectionUtil.isNotEmpty(beanContainer)) {
initIOC(beanContainer);
}
}
private static void initIOC( Map<String, Object> beanContainer) {
for (Map.Entry<String, Object> beanEntry : beanContainer.entrySet()) {
String className = beanEntry.getKey();
Object beanInstance = beanEntry.getValue();
Class<?> beanClass = null;
try {
beanClass = Class.forName(className);
System.out.println(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//Controller类中定义的属性
Field[] beanFields = beanClass.getDeclaredFields();
if (ArrayUtil.isNotEmpty(beanFields)) {
for (Field beanField : beanFields) {
//带有Autowired注解的成员变量
if (beanField.isAnnotationPresent(Autowired.class)) {
//成员变量的类
Class<?> beanFieldClass = beanField.getType();
Object beanFieldInstance = beanContainer.get(beanFieldClass.getName());
if (beanFieldInstance != null) {
//依赖注入
BeanFactory.setField(beanInstance, beanField, beanFieldInstance);
}
}
}
}
}
}
}