总体上
三层架构{
1.dao层
.mysql
.oracle
2.model层
3.service层
}
除了三层架构以外,还加了一个util工具包
com.spring.dao //数据库处理层
com.spring.dao.mysql //数据库处理层
com.spring.dao.oracle //数据库处理层
com.spring.model //模型
com.spring.service //业务逻辑层
com.spring.util //bean工厂
具体实现
dao层的实现
StudentDAO的实现
package com.spring.dao;
import com.spring.model.Student;
public interface StudentDAO {
public void save(Student s);
}
UserDAO的实现
package com.spring.dao;
import com.spring.model.User;
public interface UserDAO {
public void save(User u);
}
dao.mysql层
package com.spring.dao.mysql;
import com.spring.dao.StudentDAO;
import com.spring.model.Student;
public class StudentMysqlDAO implements StudentDAO{
@Override
public void save(Student s) {
//具体调用数据库处理层的方法
System.out.println("a student save to mysql");
}
}
package com.spring.dao.mysql;
import com.spring.dao.UserDAO;
import com.spring.model.User;
public class UserMysqlDAO implements UserDAO{
@Override
public void save(User u) {
//具体调用数据库处理层的方法
System.out.println("a user save to mysql");
}
}
dao.oracle层
package com.spring.dao.oracle;
import com.spring.dao.StudentDAO;
import com.spring.model.Student;
public class StudentOracleDAO implements StudentDAO{
@Override
public void save(Student s) {
//具体调用数据库处理层的方法
System.out.println("a student save to oracle");
}
}
package com.spring.dao.oracle;
import com.spring.dao.UserDAO;
import com.spring.model.User;
public class UserOracleDAO implements UserDAO{
@Override
public void save(User u) {
//具体调用数据库处理层的方法
System.out.println("a user save to oracle");
}
}
model层的实现
package com.spring.model;
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.spring.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;
}
}
service层的实现
package com.spring.service;
import com.spring.dao.StudentDAO;
import com.spring.model.Student;
public class StudentMgr {
private StudentDAO studentDAO;
public StudentDAO getStudentDAO() {
return studentDAO;
}
public void setStudentDAO(StudentDAO studentDAO) {
this.studentDAO = studentDAO;
}
public void save(Student s){
studentDAO.save(s);
}
}
package com.spring.service;
import com.spring.dao.UserDAO;
import com.spring.model.User;
public class UserMgr {
private UserDAO userDAO;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public void save(User u){
userDAO.save(u);
}
}
util层的实现
package com.spring.util;
public interface BeanFactory {
public Object getBean(String id);
}
package com.spring.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4J implements BeanFactory{
Map<String,Object> beans = new HashMap<String,Object>();
public Document read() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(Dom4J.class.getClassLoader().getResourceAsStream("beans.xml"));
return document;
}
public Element getRootElement(Document doc){
return doc.getRootElement();
}
public Dom4J() throws DocumentException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Element root = getRootElement(read());
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
String id = element.attribute("id").getText();
String className = element.attribute("class").getText();
Object o = Class.forName(className).newInstance();
beans.put(id, o);
for(Iterator j = element.elementIterator("property");j.hasNext();){
Element property = (Element)j.next();
String propertyIdValue = property.attribute("name").getText();
String bean = property.attribute("bean").getText();
//拿到bean中的dao
Object beanObject = beans.get(bean);
//构建方法名
String methodName = propertyIdValue;
methodName = "set"+methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
//拿到具体的方法,已知该方法在o下,而o对应的ClassName在上文已经给出
//o.getClass().getInterfaces();
Class cls = o.getClass();
Method setMethod = cls.getDeclaredMethod(methodName,beanObject.getClass().getInterfaces()[0]);
//给对应的object设置好dao
setMethod.invoke(o, beanObject);
}
}
}
public Object getBean(String name){
return beans.get(name);
}
}
xml配置,路径设置在src下,bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="u" class="com.spring.dao.oracle.UserOracleDAO" />
<bean id="userMgr" class="com.spring.service.UserMgr" >
<property name="userDAO" bean="u"/>
</bean>
<bean id="s" class="com.spring.dao.mysql.StudentMysqlDAO"/>
<bean id="studentMgr" class="com.spring.service.StudentMgr">
<property name="studentDAO" bean="s"/>
</bean>
</beans>
junity测试类
import java.lang.reflect.InvocationTargetException;
import org.dom4j.DocumentException;
import org.junit.Test;
import com.spring.model.Student;
import com.spring.model.User;
import com.spring.service.StudentMgr;
import com.spring.service.UserMgr;
import com.spring.util.BeanFactory;
import com.spring.util.Dom4J;
public class SaveTest {
@Test
public void saveStudent() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, DocumentException{
Student s = new Student();
s.setName("123");
BeanFactory bf = new Dom4J();
StudentMgr studentMgr = (StudentMgr)bf.getBean("studentMgr");
studentMgr.save(s);
}
@Test
public void saveUser() throws Exception{
User u = new User();
u.setUsername("123");
u.setPassword("123");
BeanFactory bf = new Dom4J();
UserMgr userMgr = (UserMgr)bf.getBean("userMgr");
userMgr.save(u);
}
}
通过dom4j读取xml中的配置,动态load对象,然后用getBean(string)方法就能动态得到xml中配置的对象