package com.kang.myIoc;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.PropertyValue;
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Description 模拟IOC容器
* @ClassName MyIocApplicationcontext
* @Author 康世行
* @Date 19:38 2022/6/20
* @Version 1.0
**/
public class MyIocApplicationXmlContext {
//存储单例对象(成品)
private Map<String, Object> singletonMap=new ConcurrentHashMap<>();
//bean定义(半成品)
private Map<String,BeanDefinition> beanDefinitionsMap=new ConcurrentHashMap<>();
public MyIocApplicationXmlContext(String applicationContext) {
try {
//加载xml文件,获取定义的bean
InputStream resourceAsStream = this.getClass().getResourceAsStream(applicationContext);
//使用 DocumentBuilderFactory 把xml 输入流转成xml文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document beanDefinitionXml = factory.newDocumentBuilder().parse(resourceAsStream);
//获取xml 定义的bean
NodeList beans = beanDefinitionXml.getElementsByTagName("bean");
//获取beanList长度
int length = beans.getLength();
//遍历所有bean节点获取 bean定义的信息
for (int i = 0; i < length; i++) {
//获取bean节点
Node item = beans.item(i);
//获取bean id ,beanClassName
String beanName = item.getAttributes().getNamedItem("id").getNodeValue();
String beanClassName = item.getAttributes().getNamedItem("class").getNodeValue();
//获取Scope节点
Node scopeNode = item.getAttributes().getNamedItem("scope");
//bean类型默认是空的,也就是单例类型
String scope="";
if (scopeNode!=null){
scope = item.getAttributes().getNamedItem("scope").getNodeValue();
}
//根据beanClassName 获取beanClass 对象
Class<?> beanObjectClass = Class.forName(beanClassName);
//获取bean 注入的内容-属性和属性值
MutablePropertyValues propertyValues=new MutablePropertyValues();
//获取item 子节点,bean的属性值及属性值
NodeList propertyList = item.getChildNodes();
for (int i1 = 0; i1 < propertyList.getLength(); i1++) {
Node propertyNode = propertyList.item(i1);
//判断是否获取到属性节点
if (propertyNode==null){
//跳过本次循环
continue;
}
Node nextSibling = propertyNode.getNextSibling();
if (nextSibling==null){
continue;
}
//一对属性(键值)
NamedNodeMap attributes = nextSibling.getAttributes();
if (attributes!=null){
String name = attributes.getNamedItem("name").getNodeValue();
String value = attributes.getNamedItem("value").getNodeValue();
//赋值到 propertyValues 里
propertyValues.addPropertyValue(name,value);
}
}
// 新建BeanDefinition 对象
BeanDefinition beanDefinition=new BeanDefinition();
beanDefinition.setBeanName(beanName);
beanDefinition.setClassloader(beanObjectClass);
beanDefinition.setPropertyValues(propertyValues);
beanDefinition.setScope(scope);
//bean定义存入到集合中,用于getbean 的时候,创建对象使用。
beanDefinitionsMap.put(beanName,beanDefinition);
}
//遍历beanDefinitionsMap 把单例bean对象创建出来使用getbean
for (Map.Entry<String, BeanDefinition> stringBeanDefinitionEntry : beanDefinitionsMap.entrySet()) {
String beanNameId = stringBeanDefinitionEntry.getKey();
BeanDefinition beanDefinition = stringBeanDefinitionEntry.getValue();
String scope = beanDefinition.getScope();
//如果是单例类型,调用getbean创建bean
if ("singleton".equals(scope)){
getbean(beanNameId);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @author 康世行
* @description: 根据对象ID,在ioc容器获取对象。
* @date 2022/6/20 19:43
* @param beanName
* @return java.lang.Object
* @Version1.0
**/
public Object getbean(String beanName){
//先从单例map中获取指定对象名的单例对象
Object singleBean = singletonMap.get(beanName);
if (singleBean==null){
//没有获取到单例bean对象,从bean定义map中获取bean信息进行创建
BeanDefinition beanDefinition = beanDefinitionsMap.get(beanName);
//只有获取到bean的定义信息才进行创建对象
if (beanDefinition!=null){
singleBean= createBean(beanDefinition);
}
}
return singleBean;
}
/**
* @author 康世行
* @description: 创建bean对象
* @date 2022/6/20 23:56
* @param beanDefinition
* @return java.lang.Object
* @Version1.0
**/
private Object createBean(BeanDefinition beanDefinition){
String scope = beanDefinition.getScope();
Object result=new Object();
//判断bean类型(默认是单例类型)
if ("singleton".equals(scope)||"".equals(scope)){
//创建对象实例
result = createInstance(beanDefinition);
//获取beanName
String beanName = beanDefinition.getBeanName();
//创建的对象放入到单例bean容器
singletonMap.put(beanName,result);
//返回容器对象
result= singletonMap.get(beanName);
return result;
}else if ("prototype".equals(scope)){
//进行原型类型 逻辑处理
//创建对象实例
result = createInstance(beanDefinition);
return result;
}
return result;
}
/**
* @author 康世行
* @description: 创建对象实例并且赋值
* @date 2022/6/21 9:37
* @param beanDefinition
* @return java.lang.Object
* @Version1.0
**/
private Object createInstance(BeanDefinition beanDefinition){
//组装完属性之后的对象
Object result=new Object();
//进行单例类型逻辑处理
try {
//获取bean属性
MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
//获取beanClass
Class beanClass = beanDefinition.getClassloader();
//beanClass 创建对象
result= beanClass.newInstance();
for (PropertyValue propertyValue : propertyValues) {
String name = propertyValue.getName();
Object value = propertyValue.getValue();
//根据name 获取指定字段
Field declaredField = beanClass.getDeclaredField(name);
//获取字段类型
Class<?> type = declaredField.getType();
if
评论0