[Java] Spring 3.0 01/02/03/04/05 -自设源代码
UserDAO
package com.bjsxt.dao; import com.bjsxt.model.User; public interface UserDAO { // 和数据库打交道 public void save(User u); // 访问 mysql 的代码 }UserDAOImpl
package com.bjsxt.dao.impl; import com.bjsxt.dao.UserDAO; import com.bjsxt.model.User; public class UserDAOImpl implements UserDAO { @Override public void save(User u) { // TODO Auto-generated method stub System.out.println("a user saved!"); } }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; } }UserService
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; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public void add(User u) { this.userDAO.save(u); // 添加用户会将用户添加到 DB 中。 } }BeanFactory
package com.bjsxt.spring; public interface BeanFactory { public Object getBean(String name); }ClassPathXmlApplicationContext
package com.bjsxt.spring; import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jdom.Document; import org.jdom.Element; import org.jdom.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");// 取名字为disk的所有元素 for (int i = 0; i < list.size(); i++) { Element element = (Element) list.get(i); String id = element.getAttributeValue("id"); String clazz = element.getAttributeValue("class");// 取disk子元素capacity的内容 System.out.println(id + ": " + clazz); 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]); //实现接口可能会实现多个,这个是第一个UserDAO, setUserDAO(UserDAO.class) // 根据 方法名 与 类 得到 Method m.invoke(o, beanObject); // 调用 setUserDAO 这个方法将实现这个接口 UserDAO 的类的实例 (也就是UserDAOImpl instance) 这个对象传进去 } } } @Override public Object getBean(String name) { // TODO Auto-generated method stub return beans.get(name); } }beans.xml
<beans> <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"/> <bean id="userService" class="com.bjsxt.service.UserService"> <property name="userDAO" bean="u"/> <!-- 代表 userService 中有一个 setUserDAO 的方法,也就间接代表 其中有一个 userDAO 成员变量,其值初始化为 id 为 u 的 class。--> </bean> </beans>UserServiceTest.java
package com.bjsxt.service; import static org.junit.Assert.*; 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() throws Exception { BeanFactory factory = new ClassPathXmlApplicationContext(); UserService service = (UserService)factory.getBean("userService"); // new UserService(); UserDAO userDAO = (UserDAO) factory.getBean("u"); service.setUserDAO(userDAO); User u = new User(); service.add(u); } }