ClassPathXmlApplicationContext工作原理
创建一个ClassPathXmlApplicationContext类
package com.qx;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Constructor;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
/**
* @author : k
* @Date : 2022/4/9
* @Desc :
*/
public class ClassPathXmlApplicationContext {
private static Map<String,Object> beanMap = new HashMap<>();
private String filePath;
public ClassPathXmlApplicationContext(String filePath){
this.filePath = filePath;
load();
}
private void load(){
try {
//获取resources目录下的.xml文件 beans.xml
String path = ClassPathXmlApplicationContext.class.getClassLoader().getResource(filePath).getPath();
//将我们的路径编码设置为utf-8 否则会出现乱码
path = URLDecoder.decode(path,"utf-8");
//解析path 修改为正常的路径 D:/Java学习/Spring/spring_00_IOD/target/classes/beans.xml
Document document = Jsoup.parse(new File(path), "utf-8");
//使用document里边的方法 通过获取元素标签的方法 取得 beans.xml文件中的bean标签
//<bean class="com.qx.dao.impl.UserDaoImpl2" id="userDao"/>
Elements beans = document.getElementsByTag("bean");
//判断获取到的beans是否为空,如果为空则不执行
if (beans != null&& beans.size()>0){
for (int i = 0;i<beans.size();i++){
//遍历所有的bean标签
Element bean = beans.get(i);
//获取bean标签中的class和id值
//获取bean标签中的属性 bean.attr("class"); 获取标签中的class属性
// bean.attr("id"); 获取标签中id属性
String className = bean.attr("class");//com.qx.dao.impl.UserDaoImpl* 全类名
String id = bean.attr("id");//userDao
//通过反射创建对应类的对象 反射可以使用当前文件下的绝对路径(com.qx.dao.impl.UserDaoImpl*) 获取到这个类
Class<?> clazz = Class.forName(className);
Constructor<?> constructor = clazz.getConstructor();//获取这个类里边的构造方法
Object obj = constructor.newInstance();//调用里边的构造方法 去构造对象 即new出这个构造方法
//把id作为key 创建出来的对象作为value存入map中
beanMap.put(id,obj);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据id从容器中获取对应的对象
* @param id
* @return
*/
public Object getBean(String id){
return beanMap.get(id);//根据id从map中取得value
}
}
创建UserDao
package com.qx.dao;
/**
* @author : k
* @Date : 2022/4/9
* @Desc :
*/
public interface UserDao {
String getUserNameById(Integer id);
}
创建UserDao实现类
package com.qx.dao.impl;
import com.qx.dao.UserDao;
/**
* @author : k
* @Date : 2022/4/9
* @Desc :
*/
public class UserDaoImpl1 implements UserDao {
@Override
public String getUserNameById(Integer id) {
return "qx111";
}
}
package com.qx.dao.impl;
import com.qx.dao.UserDao;
/**
* @author : k
* @Date : 2022/4/9
* @Desc :
*/
public class UserDaoImpl2 implements UserDao {
@Override
public String getUserNameById(Integer id) {
return "qx222";
}
}
创建beans.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- <bean class="com.qx.dao.impl.UserDaoImpl1" id="userDao"/>-->
<bean class="com.qx.dao.impl.UserDaoImpl2" id="userDao"/>
</beans>
测试
package com.qx;
import com.qx.dao.UserDao;
import com.qx.dao.impl.UserDaoImpl2;
/**
* @author : k
* @Date : 2022/4/9
* @Desc :
*/
public class Demo {
public static void main(String[] args) {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("beans.xml");
//获取bean中的id属性值
UserDao UserDao = (UserDao) classPathXmlApplicationContext.getBean("userDao");
System.out.println(UserDao.getUserNameById(1));
// UserDao userDao = new UserDaoImpl1();
}
}