dom4j实现模拟Spring读取配置文件 注入

本文介绍了一个使用 Spring 框架实现的简单 IOC 容器案例,包括配置文件解析、依赖注入及基本的服务调用流程。展示了如何通过 XML 配置文件定义 Bean 的实例化与装配过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.

beans.xml

<?xml version="1.0" encoding="UTF-8" ?> <beans> <bean id="u" class="com.bjsxt.impl.UserDAOImpl" /> <bean id="userService" class="com.bjsxt.service.UserService"> <property name="userDAO" ref="u"></property> </bean> </beans>

2.UserDao代码

package com.bjsxt.dao; import com.bjsxt.model.User; public interface UserDAO { public void save(User user); }

3.

package com.bjsxt.impl; import com.bjsxt.dao.UserDAO; import com.bjsxt.model.User; public class UserDAOImpl implements UserDAO{ @Override public void save(User user) { System.out.println("a user save !"); } }

4.User类

package com.bjsxt.model; public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }

5.UserService类

package com.bjsxt.service; import com.bjsxt.dao.UserDAO; import com.bjsxt.impl.UserDAOImpl; import com.bjsxt.model.User; public class UserService { private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public void add(User user){ userDAO.save(user); } }

6.BeanFactory接口

package com.bjsxt.spring; public interface BeanFactory { public Object getBean(String name); }

7.读取XML文件代码也是最重要的代码

package com.bjsxt.spring; import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import com.bjsxt.util.XMLUtils; public class ClassPathXmlApplicationContext implements BeanFactory{ private Map<String,Object> beans = new HashMap<String,Object>(); @SuppressWarnings("unchecked") public ClassPathXmlApplicationContext() throws Exception { Document document = XMLUtils.readXML(); //List<Element> list = document.selectNodes("/beans/bean"); Element root = document.getRootElement(); List<Element> list = root.elements(); for(Element element : list){ String id = element.attributeValue("id"); String clazz = element.attributeValue("class"); Object o = Class.forName(clazz).newInstance(); beans.put(id, o); List<Element> propertyList = element.elements(); for(Element propertyElement : propertyList){ String name = propertyElement.attributeValue("name"); //方法名 String methodName = "set" + name.substring(0,1).toUpperCase() + name.substring(1); String ref = propertyElement.attributeValue("ref"); // u Object obj = beans.get(ref); //得到参考的对象 //o 代表 com.bjsxt.service.UserService 类 //参数 setUserDAO,UserDAO接口 Method m = o.getClass().getMethod(methodName, obj.getClass().getInterfaces()[0]); m.invoke(o, obj); //userService.setUserDAO() } } } public Object getBean(String name){ return beans.get(name); } public static void main(String[] args) throws Exception { new ClassPathXmlApplicationContext(); } }

8.工具类

package com.bjsxt.util; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; public class XMLUtils { public static Document readXML() { Document document = null; try { document = new SAXReader().read(XMLUtils.class.getResourceAsStream("beans.xml")); return document; } catch (DocumentException e) { e.printStackTrace(); } return document; } public static void main(String[] args) { Document document = readXML(); System.out.println(document); } }

测试类:

(在工程中创建一个SourceFolder文件夹(取名为test)

在UserService.java上右键创建一个Junit Test Case会得到一个UserServiceTest.java文件 再将它移到test文件夹下)

package com.bjsxt.service; import org.junit.Test; import com.bjsxt.dao.UserDAO; import com.bjsxt.model.User; import com.bjsxt.spring.BeanFactory; import com.bjsxt.spring.ClassPathXmlApplicationContext; public class UserServiceTest { @Test public void testAdd() { try { BeanFactory beanFactory = new ClassPathXmlApplicationContext(); //通过配置文件得到UserDAOImpl对象 UserDAO userDAO = (UserDAO) beanFactory.getBean("u"); UserService userService = (UserService) beanFactory.getBean("userService"); //userService.setUserDAO(userDAO); //不用写,ClassPathXmlApplicationContext中用反射setUserDAO了 userService.add(new User()); } catch (Exception e) { e.printStackTrace(); } } }

右键UserServiceTest.java

Run as-->Junit Test

2011-1-16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值