Spring IOC 容器 bean对象实例化模拟
1.创建一个普通的maven项目
在pom.xmll文件中导入dom4j解析器和xpath路径分析器
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
2.创建一个实例化类
作用:来接收文件的id 和 class 文件对象
//定义一个对象,来接收bean文件中的id 和 class 信息
public class MyBean {
private String id;
private String Clazz;
public MyBean(String id, String clazz) {
this.id = id;
this.Clazz = clazz;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClazz() {
return Clazz;
}
public void setClazz(String clazz) {
Clazz = clazz;
}
}
3.在reasource文件包下创建spring.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<beans>
<bean id = "userDao" class = "com.Dao.UserDao"></bean>
</beans>
4.创建一个工厂类接口
- 规范接口
- 接收文件
public interface MyFactory {
// 规范
// 通过id 属性值 获取bean对象
public Object getBean(String id);
}
5.创建一个工厂类
1.获取文件并解析
2.用dom4j解析配置文件,并得到list集合
3.反射得到实例化对象,遍历集合,得到classs属性,利用Class.forName(class).newInstance()
4.获取指定对象
代码实现
private List<MyBean> beanList;
private Map<String,Object> beanMap = new HashMap<>();
public MyClassPathApplicationXml(String fileName) {
// 1.通过dom4j解析文件,得到list(存放id 和 class )
this.parseXml(fileName);
// 2.遍历List,将实例化的对象存放到beanMap中
this.instanceBeans(fileName);
}
private void parseXml(String fileName) {
//1.获取解析器
SAXReader saxReader = new SAXReader();
//2.得到配置文件的路径
URL url = this.getClass().getClassLoader().getResource(fileName);
try {
//3.通过解析器解url
Document document = saxReader.read(url);
//4.获取xpath 语法,获取beans 下的 bean
XPath xPath = document.createXPath("beans/bean");
//5.通过指定语法解析对象,将其存入list中
List<Element> elements = xPath.selectNodes(document);
if(elements != null && elements.size() > 0){
beanList = new ArrayList<>();
for(Element el : elements){
String id = el.attributeValue("id"); //id 属性
String clazz = el.attributeValue("class"); //class 属性
MyBean myBean = new MyBean(id,clazz);
beanList.add(myBean);
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
private void instanceBeans(String fileName) {
if(beanList != null && beanList.size() > 0){
for(MyBean myBean: beanList){
String id = myBean.getId();
String clazz = myBean.getClazz();
//
try {
//实例化对象
Object object = Class.forName(clazz).newInstance();
//将实例化对象存入到hashmap中
beanMap.put(id,object);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
调用
public static void main(String[] args) {
MyFactory myFactory = new MyClassPathApplicationXml("spring.xml");
UserDao userDao = (UserDao) myFactory.getBean("userDao");
userDao.test();
}