Spring之模拟XML的读取
来源:互联网 发布:修改pop3端口号 编辑:程序博客网 时间:2024/06/05 05:54
Spring开始学习了。我是跟着马士兵的视频自学的。
首先模拟Spring对配置文件的操作。
需要的额外的包:
jdom.jar,junit.jar.
源码:
model:
User.java
public class User {private String name;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;}}
DAO:
UserDAO.java
package com.bjsxt.dao;import com.bjsxt.model.User;public interface UserDAO {public void save(User u);}
Implments:
UserDAOImpl.java
package com.bjsxt.dao.impl;import com.bjsxt.dao.UserDAO;import com.bjsxt.model.User;public class UserDAOImpl implements UserDAO{@Overridepublic void save(User u) {System.out.println("user saved!");}}
Service:
UserService.java
package com.bjsxt.service;import com.bjsxt.dao.UserDAO;import com.bjsxt.dao.impl.UserDAOImpl;import com.bjsxt.model.User;public class UserService {private UserDAO userDAO; //依赖于beans.xml通过ClassPathXmlApplicationContext.java注入public UserDAO getUserDAO() {return userDAO;}public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}public void add(User user){this.userDAO.save(user);}}
这个是beans.xml,也是Spring框架的配置文件:
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"/><bean id ="userService" class="com.bjsxt.service.UserService"><property name="userDAO" bean="u"></property></bean></beans>
BeanFactory.java
下面就是模拟Spring对beans.xml的读取和对其内容的操作:
package com.bjsxt.spring;public interface BeanFactory {public Object getBean(String name);}
ClassPathXMLApplication.java
对BeanFactory.java的interface的实现:
package com.bjsxt.spring;import java.lang.reflect.Method;import java.util.HashMap;import java.util.List;import java.util.Map;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.input.SAXBuilder;public class ClassPathXmlApplicationContext implements BeanFactory{private Map<String,Object> beans = new HashMap<String, Object>();public ClassPathXmlApplicationContext() throws Exception {SAXBuilder sb = new SAXBuilder();Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));Element root = doc.getRootElement();//获取根元素List list = root.getChildren("bean");for (int i = 0; i < list.size(); i++) { Element element = (Element) list.get(i); String id = element.getAttributeValue("id"); String clazz = element.getAttributeValue("class"); System.out.println(id + " : " + clazz); System.out.println(""); Object o = Class.forName(clazz).newInstance(); beans.put(id, o); for(Element propertyElement : (List<Element>)element.getChildren("property")){ String name = propertyElement.getAttributeValue("name");//userDAO String bean = propertyElement.getAttributeValue("bean");//u Object beanObject = beans.get(bean);//UserDAOImpl instance String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); System.out.println("method name = " + methodName); Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);//setUserDAO m.invoke(o, beanObject); } }}@Overridepublic Object getBean(String name) {return beans.get(name);}}
下面是测试类,另外再建立一个源文件test的文件夹:
package com.bjsxt.service;import org.junit.Test;import com.bjsxt.model.User;import com.bjsxt.spring.BeanFactory;import com.bjsxt.spring.ClassPathXmlApplicationContext;public class UserServiceTest {@Testpublic void testAdd() throws Exception {BeanFactory applicationContext = new ClassPathXmlApplicationContext();UserService service = (UserService)applicationContext.getBean("userService");User u = new User();u.setUsername("zhangsan");u.setPassword("zhangsan");service.add(u);}}
至此视频上的代码,结束,我觉得有些许收获。
此小项目的核心是:ClassPathXMLApplication.java的内容。实现了对XML文件的处理,将<key,value>的值放到Map中,当在main中 ,执行到:
时,new ClassPathXMLApplicationContext();调用构造方法的时候,就已经对XML进行读取了,并且对每一个<id,class>做了反射。
所以当调用applicationContext.getBean("UserService");的时候,就会生成UserService类 并且其变量名为 service。
将User的类的变量add到service中,就OK了。
这是我对上述源码的一个分析,暂时就这么多了吧。
- Spring之模拟XML的读取
- 模拟spring的注入和读取配置文件(ApplicationContext.xml)
- 模拟spring的注入和读取配置文件(ApplicationContext.xml)
- [Java] 设计模式之工厂系列 04 (自定义模拟 spring 读取xml文件 beanFactory)
- [模拟Spring]java读取xml文件,并实例化
- 扒一扒spring,dom4j实现模拟实现读取xml
- Spring之使用JDOM读取XML文件
- 工作学习之spring:spring初始化读取xml配置文件
- spring读取xml的两种方法
- spring读取xml配置
- Spring读取xml文件
- 工程模式 JDom读取xml模拟Sping的Bean工厂
- 模拟XML文件信息的读取并创建实例
- Spring框架中如何读取Spring的XML配置文件
- 用dom4j读取配置文件来模拟spring的bean工厂
- C#之读取web上的xml
- java解析xml模拟容器的实现 如spring等
- 通过代码模拟dom4j解析spring的ApplicationContext XML文件
- 使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(4)
- Java学习笔记6——图形编程
- 看各种官方文档中发现的小tips
- 简单的选择排序
- Java学习笔记7——事件处理
- Spring之模拟XML的读取
- Android SDK Manager无法更新的解决
- 【学习】IE浏览器,对话框,地址栏,搜索框无法输入文字
- 王二的经济学故事 开读
- POJ 1654 Area (计算多边形面积)
- 51汇编程序编写的一些原则
- poj 3252 Round Numbers
- MVC multi-tenancy in ASP.NET MVC
- kernel对于SO_REUSEADDR的处理——避免滥用引发Bug