思路:
????????1、定义Bean工厂接口,提供获取bean方法
????????2、定义Bean工厂接口实现类,解析配置文件,实现Bean对象
????????3、实现获取Bean方法
定义Bean属性对象
? ? ? ? Spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="org.example.dao.UserDao"></bean>
<bean id="userDao" class="org.example.service.UserService"></bean>
</beans>
? ? ? ?工厂类实现类:
? ? ? ? ? ? ? ? 1、通过构造器的形参传递要解析的配置文件;
? ? ? ? ? ? ? ? 2、解析配置文件,得到对应的bean标签的id与class属性值,并设置对应的bean对象中,存放到 list 集合里;
? ? ? ? ? ? ? ? 3、遍历list集合,得到每个Bean对象,得到class属性对应的实例化对象,并设置到map中,通过id与实例化bean对象;
? ? ? ? ? ? ? ? 4、通过getBean方法,从map对象中通过id获取指定value,value即是实例化对象。
????????
? ? ? ? ?XPath是一门在XML文档中查找信息的语言,其是XSLT中的注意元素。XQuery和XPointer均构建与XPath表达式之上。XPath使用路径表达式来选取XML文档中的节点活节点集。节点是通过沿着路径(path)或者步(steps)来选取的。(了解即可)
????????
?????????MyClassPathXmlApplication.java:
package org.example.factory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 工厂接口的实现类
* 1、通过构造器的形参传递要解析的配置文件
* 2、解析配置文件,得到对应的bean标签的id与class属性值,并设置到对应的bean对象中,存放到list集合里
* 3、遍历list集合,得到每个Bean对象,得到class属性对应的实例化对象,并设置到map中,通过id与实例化bean对象
* 4、通过getBean方法,从map对象中通过id获取指定value,value即是实例化的对象
*/
public class MyClassPathXmlApplication implements MyFacotry {
// 定义一个Map对象,用来存放id属性与对应class属性实例化好的Bean对象
private Map<String,Object> beanMap = new HashMap<>();
// 定义List集合,用来存放配置文件中Bean中对应的id与class的mybean(用来存放id与class属性值)中
private List<MyBean> beanlist = null;
// 1、通过构造器的形参传递要解析的配置文件
public MyClassPathXmlApplication(String fileName) {
// 解析配置文件
parseXml(fileName);
// 得到实例化对象
instanceBean();
}
// 2、解析配置文件,得到对应的bean标签的id与class属性值,并设置到对应的bean对象中,存放到ist集合里
private void parseXml(String fileName) {
try {
//得到解析器
SAXReader reader = new SAXReader();
//得到配置文件对应的URL
URL url = this.getClass().getClassLoader().getResource(fileName);
//解析配置文件得到Document对象
Document document = reader.read(url);
/**
* xPath使用路径表达式来选取XML文档中的节点或节点集
* 定义xPath语法,获取beans标签下的所有子元素bean标签
*/
XPath xPath = document.createXPath("beans/bean");
// 通过xPath语法,得到对应的bean标签,返回Element集合
List<Element> elementList = xPath.selectNodes(document);
// 判断Element集合是否为之空
if (elementList != null && elementList.size() > 0){
// 实例化beanList集合
beanlist = new ArrayList<>();
// 遍历Element集合,得到Element对象,得到对应的属性值
for (Element element : elementList){
//得到对应的id属性值 attributeValue:通过指定属性名得到对应的属性值
String id = element.attributeValue("id");
//得到对应的class属性值
String classes = element.attributeValue("class");
// 将id属性值与class属性值设置MyBean对象
MyBean myBean = new MyBean(id,classes);
// 将对应的MyBean对象设置到beanList集合中
beanlist.add(myBean);
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
// 3、遍历list集合,得到每个Bean对象,得到class属性对应的实例化对象,并设置到map中,通过id与实例化bean对象
private void instanceBean() {
// 判读beanList是否为空
try {
if (beanlist != null && beanlist.size() > 0){
// 遍历beanList集合,得到对应的MyBean对象
for (MyBean myBean : beanlist){
// 得到id值
String id = myBean.getId();
// 得到class值
String classes = myBean.getClasses();
// 通过反射,实例化指定class属性值对应的Bean对象
Object object = Class.forName(classes).newInstance();
// 将id值与实例化好的bean对象,设置到map中
beanMap.put(id,object);
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 4、通过getBean方法,从map对象中通过id获取指定value,value既是实例化的对象
@Override
public Object getBean(String id) {
// 通过id属性,从map获取对应的实例化对象
Object object = beanMap.get(id);
return object;
}
}
? ? ? ? MyFactory.java:
package org.example.factory;
/**
* 工厂模式
* 自定义工厂类
*/
public interface MyFacotry {
//通过id属性值获取实例化对象
public Object getBean(String id);
}
? ? ? ? UserService.java:
package org.example.service;
public class UserService {
public void test(){
System.out.println("UserService...");
}
}
? ? ? ? UserDao.java:
package org.example.dao;
public class UserDao {
public void test(){
System.out.println("UserDao...");
}
}
? ? ? ? start.java:
package org.example;
import org.example.factory.MyClassPathXmlApplication;
import org.example.factory.MyFacotry;
import org.example.service.UserService;
public class start {
public static void main(String[] args) {
// 得到工厂类
MyFacotry facotry = new MyClassPathXmlApplication("spring.xml");
// 通过getBean方法,得到指定的Bean对象
UserService userService = (UserService) facotry.getBean("userDao");
userService.test();
}
}
? ? ? ? 结果是”UserService...“。
|