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