思路:
1.定义Bean 工厂接口,提供获取bean方法
2.定义Bean工厂接口实现类,解析配置文件,实例化Bean对象
3.实现获取Bean方法
1.创建Maven的普通java项目
2.设置项目的坐标、名称、工作空间
3.设置项目的 Maven 环境
package com.xxxx.po; public class MyBean { private String id;//bean标签的id属性 private String clazz;//bean标签的class属性 public MyBean() { } 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) { this.clazz = clazz; } }添加 dom4j 和 XPath 坐标依赖
准备自定义配置文件dom4j dom4j1.6.1 jaxen jaxen1.1.6
spring.xml
定义 Bean 工厂接口
package com.xxxx.factory; public interface MyFactory { //通过id属性获取bean对象 public Object getBean(String id); }定义 Bean 接口的实现类
package com.xxxx.factory; import com.xxxx.po.MyBean; 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; public class MyClassPathXmlApplication implements MyFactory{ private List创建与配置文件中对应的 Bean 对象beanList = null;//存放解析好的bean标签集合 private Map beanMap = new HashMap<>();//实例化好的bean对象放入map //获取要解析的配置文件 //通过带参构造器得到相关配置文件 public MyClassPathXmlApplication(String fileName){ //解析配置文件,将结果设置到list中 this.parseXml(fileName); //实例化Bean对象,将结果设置到map中 this.instanceBean(); } private void parseXml(String fileName) { //获取解析器 SAXReader saxReader = new SAXReader(); //得到要解析的配置文件的url URL url = this.getClass().getClassLoader().getResource(fileName); try { //通过解析器解析xml文件(spring.xml),返回document对象 document document = saxReader.read(url); //通过xpath语法,获取beans标签下的所有bean标签 XPath xPath = document.createXPath("beans/bean"); //通过XPath语法获取要解析的指定元素 List elementList = xPath.selectNodes(document); //判断标签集合是否存在 if(elementList != null && elementList.size()>0){ //实例化集合 beanList= new ArrayList<>(); //遍历集合 for(Element el : elementList){ //获取元素的id属性值和class属性值 String id = el.attributevalue("id"); String clazz = el.attributevalue("class"); //将id和clazz的值设置到对应的bean对象中 MyBean myBean = new MyBean(id,clazz); //将对应的bean对象设置到集合中 beanList.add(myBean); } } } catch (documentException e) { e.printStackTrace(); } } private void instanceBean() { //判断bean对象的集合是否存在 if(beanList != null && beanList.size()>0){ //遍历 for(MyBean bean : beanList){ try { //键 String id = bean.getId(); //值(实例化好的对象) //通过class的值(类路径)得到实例化对象 Object object = Class.forName(bean.getClazz()).newInstance(); //设置map beanMap.put(id,object); } catch (Exception e) { e.printStackTrace(); } } } } @Override public Object getBean(String id) { return beanMap.get(id); } }
UserService.java
package com.xxxx.service; public class UserService { public void test(){ System.out.println("UserService..."); } }
UserDao.java
package com.xxxx.dao; public class UserDao { public void test(){ System.out.println("UserDao..."); } }测试是否可以获取实例化的Bean对象
package com.xxxx; import com.xxxx.dao.UserDao; import com.xxxx.factory.MyClassPathXmlApplication; import com.xxxx.factory.MyFactory; import com.xxxx.service.UserService; public class App { public static void main(String[] args) { //得到上下文环境 MyFactory factory = new MyClassPathXmlApplication("spring.xml"); //得到实例化好的对象 UserService userService = (UserService) factory.getBean("userService"); UserDao userDao = (UserDao) factory.getBean("userDao"); UserDao userDao2 = (UserDao) factory.getBean("userDao"); System.out.println(userDao); System.out.println(userDao2); userService.test(); userDao.test(); } }测试结果
com.xxxx.dao.UserDao@4e515669 com.xxxx.dao.UserDao@4e515669 UserService... UserDao...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)