`

spring简单模拟(面向抽象/接口编程)

 
阅读更多

1.实体类

User.java

package com.test.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;
	}
}

 

2.数据访问对象(dao-data access object)

UserDAO.java

package com.test.dao;

import com.test.model.User;

public interface UserDAO {
	public void save(User user);
}

 

3.实现dao层类

UserDAOImpl.java

package com.test.dao.impl;

import com.test.dao.UserDAO;
import com.test.model.User;

public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

 

4.服务类

UserService.java

package com.test.service;

import com.test.dao.UserDAO;
import com.test.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;
	}
}

 

5.依赖注入userDao(以下是核心部分)

(1)配置文件

beans.xml

<beans>
	<bean id="userDAOImpl" class="com.test.dao.impl.UserDAOImpl" />
	<bean id="userService" class="com.test.service.UserService">
		<property name="userDAO" bean="userDAOImpl" />
	</bean>
</beans>

 

说明:property标签中name属性值(userDao)UserService服务类中的成员变量,在此配置文件中,它配置的实现类是UserDAOImpl

(2)bean工厂接口类

BeanFactory.java

package com.test.spring;

public interface BeanFactory {
	public Object getBean(String id);
}

 

(3)实现bean工厂类

ClassPathXmlApplicationContext.java

package com.test.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>();

	// IOC(Inverse of Control):控制反转
	// DI(Dependency Injection):依赖注入
	public ClassPathXmlApplicationContext() throws Exception {
		SAXBuilder sb = new SAXBuilder();
		Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); // 构造文档对象
		Element root = doc.getRootElement(); // 获取根元素beans
		List list = root.getChildren("bean");// 取名字为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"); // userDAO
				String bean = propertyElement.getAttributeValue("bean"); // userDAOImpl
				Object beanObject = beans.get(bean);// UserDAOImpl实例
				String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
				// 指定对象o本身的类的methodName方法的参数为:beanObject实现的那个接口
				Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
				// 调用对象o中的methodName方法(参数为:UserDAOImpl实例),相当于o.methodName(beanObject);
				m.invoke(o, beanObject);
			}
		}
	}

	public Object getBean(String id) {
		return beans.get(id);
	}

}

 

6.jUnit测试类

UserServiceTest.java

package com.test.service;

import org.junit.Test;

import com.test.model.User;
import com.test.spring.BeanFactory;
import com.test.spring.ClassPathXmlApplicationContext;

public class UserServiceTest {

	@Test
	public void testAdd() throws Exception {
		BeanFactory applicationContext = new ClassPathXmlApplicationContext();
		UserService service = (UserService) applicationContext.getBean("userService");
		User u = new User();
		u.setUsername("zhangsan");
		u.setPassword("123");
		service.add(u);
	}

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics