[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);
    }

}







posted @ 2014-01-09 22:44  小尼人00  阅读(138)  评论(0编辑  收藏  举报