利用java的反射机制和dom4j 模拟spring核心

总体上

三层架构{
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中配置的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值