spring基本原理模拟
来源:互联网 发布:阿里云个人网站备案 编辑:程序博客网 时间:2024/06/05 00:53
下面以一个简单的实例模拟spring的基本运行原理,代码结构图如下:
相关类代码如下:
package com.ctsh.dao;import com.ctsh.model.User;public interface UserDAO {public void save(User user);}
package com.ctsh.dao.impl;import com.ctsh.dao.UserDAO;import com.ctsh.model.User;public class UserDAOImpl implements UserDAO {public void save(User user) {System.out.println("user saved!");}}
package com.ctsh.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;}}
package com.ctsh.service;import com.ctsh.dao.UserDAO;import com.ctsh.model.User;public class UserService {private UserDAO userDAO;public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}}
package com.ctsh.spring;public interface BeanFactory {public Object getBean(String id);}
package com.ctsh.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");Object o = Class.forName(clazz).newInstance();beans.put(id, o);for (Element propertyElement : (List<Element>) element.getChildren("property")) {String name = propertyElement.getAttributeValue("name");String bean = propertyElement.getAttributeValue("bean");Object beanObject = beans.get(bean);String methodName = "set" + name.substring(0, 1).toUpperCase()+ name.substring(1);Method m = o.getClass().getMethod(methodName,beanObject.getClass().getInterfaces()[0]);//对对象o(即com.ctsh.service.UserService)调用m方法(即setUserDAO(com.ctsh.dao.UserDAO)方法),//其中传入参数为beanObject(即com.ctsh.dao.impl.UserDAOImpl)m.invoke(o, beanObject);}}}public Object getBean(String id) {return beans.get(id);}}beans.xml文件内容如下:
<beans><bean id="u" class="com.ctsh.dao.impl.UserDAOImpl" /><bean id="userService" class="com.ctsh.service.UserService" ><property name="userDAO" bean="u"/></bean></beans>UserServiceTest测试代码如下:
package com.bjsxt.service;import org.junit.Test;import com.ctsh.model.User;import com.ctsh.service.UserService;import com.ctsh.spring.BeanFactory;import com.ctsh.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);}}
如代码所示,spring通过类ClassPathXmlApplicationContext扫描beans.xml文件内容,通过反射机制自动装配。
0 0
- spring基本原理模拟
- spring动态代理基本原理
- Spring IOC容器基本原理
- 【Spring】AOP的基本原理
- Spring IOC容器基本原理
- Spring IOC容器基本原理
- Spring MVC基本原理
- Spring IOC容器基本原理
- Spring IOC容器基本原理
- spring JUnit 基本原理
- Spring IOC容器基本原理
- Spring IOC容器基本原理
- spring mvc 基本原理
- Spring IOC容器基本原理
- Spring框架的基本原理
- Spring IOC容器基本原理
- Spring MVC基本原理
- Spring IOC容器基本原理
- Windows内存管理
- Codeforces Round #294 (Div. 2) -- B. A and B and Compilation Errors
- android:layout_gravity和android:gravity的区别
- java中字节流与字符流的区别详解
- 黑马程序员——Map集合总结
- spring基本原理模拟
- Codeforces Round #294 (Div. 2) -- C. A and B and Team Training
- IOS解析JSON
- mina学习——(一、spring3.1.2整合mina2.0.9)
- quick-cocos2d-x 学习系列之六 CoinFlip
- 2015北京电子科技博览会-中国国际电子信息科技创新博览会
- Java类加载器学习总结
- Reverse Words in a String
- java 基础之Path,classPath的设置