工厂 + 反射+配置文件实现代码如下:
/**
* @author xiangshuai
* 所在位置:E:\学习文档子目录压缩\框架\spring\简单模拟spring IOC底层实现原理
或 我的网盘/我的笔记/学习文档子目录压缩/框架/spring/简单模拟spring IOC底层实现原理 *
*/
BeanFactory.java
package com.xiangshuai.util;
import java.util.Map;
import cn.xiangshuai.bean.User;
/**
* @author xiangshuai
* 所在位置:E:\学习文档子目录压缩\框架\spring\简单模拟spring IOC底层实现原理.doc
或 我的网盘/我的笔记/学习文档子目录压缩/框架/spring/简单模拟spring IOC底层实现原理.doc
*
*/
public class BeanFactory {
private static BeanFactory mySingleton=null;
/*私有构造方法,防止被实例化*/
private BeanFactory() {
}
public static BeanFactory getInstance(){
if(mySingleton==null){//只有第一次创建才会进入 synchronized加锁,提高性能
synchronized (BeanFactory.class){
if(mySingleton==null){//加锁,防多线程,造出多个实例
try {
//Thread.sleep(3000);
mySingleton=new BeanFactory();
}catch (Exception e){
e.printStackTrace();
}
}
};
}
return mySingleton;
}
public static Object getBean(String id){
Map
String qlm = beanMap.get(id);
Class clazz=null;
Object bean=null;
try {
clazz = Class.forName(qlm);
bean = clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bean;
}
public static void main(String[] args) {
User user = (User) BeanFactory.getInstance().getBean("user");
System.out.println(user);
//Object bean = BeanFactory.getInstance().getBean("user");
}
}
Dom4jUtil.java
package com.xiangshuai.util;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Dom4jUtil {
private static Dom4jUtil mySingleton=null;
/*私有构造方法,防止被实例化*/
private Dom4jUtil() {
}
public static Dom4jUtil getInstance(){
if(mySingleton==null){//只有第一次创建才会进入 synchronized加锁,提高性能
synchronized (Dom4jUtil.class){
if(mySingleton==null){//加锁,防多线程,造出多个实例
try {
//Thread.sleep(3000);
mySingleton=new Dom4jUtil();
}catch (Exception e){
e.printStackTrace();
}
}
};
}
return mySingleton;
}
public static Map
Map
try {
String xmlUrl="src/applicationContext.xml";
SAXReader read = new SAXReader();
Document document = read.read(xmlUrl);
Element root = document.getRootElement();
List
for (Element bean : elements) {
//假设 bean都市这种最简单的
Attribute name = bean.attribute("id");//属性节点
Attribute clazz = bean.attribute("class");//属性节点
String beanId = name.getValue();
String qlm = clazz.getValue();//获取全类名
beanMap.put(beanId, qlm); // 将 id 和 class 的值放入map 的 key ,value
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return beanMap;
}
//如果是较复杂的bean,可以用Map
public void treeWalk(Element ele) {
System.out.println(ele.getName());//输出当前节点的名子
for (int i = 0; i < ele.nodeCount(); i++) {//ele.nodeCount()得到当前节点的所有子节点的数量
Node node = ele.node(i);//取出下标为i的节点
if(node instanceof Element){//判断当前节点是否为标签
treeWalk((Element)node);//把node强转为标签(Element)
}else{
System.out.println(node.getText());
}
}
}
public static void main(String[] args) {
Map
System.out.println(beanMap);
}
}
applicationContext.xml
xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<bean id="user" class="cn.xiangshuai.bean.User" >bean>
<bean id="org" class="cn.xiangshuai.bean.Org" >bean>
beans>