我们都知道spring框架主要起管理作用,它的核心配置文件时bean.xml,那么他是如何通过配置文件来管理这么多实体类的呢。下面看简单的模拟。代码是跟着马老师敲的。
先建立如图所示框架结构,当然这样写主要是巩固对层次结构的建立,单纯模拟spring的核心主要是ClassPathXmlApplicationContext那个类。
步骤1.
首先建立User实体类,里面有name和age属性,并且生成set,get方法
package com.lin.model;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
步骤2
建立简单的DAO层, 当然具体的jdbc代码就不写了,用一个简单的输出语句来代替。
package com.lin.dao;
import com.lin.model.User;
public interface UserDAO {
public void save(User u);
}
package com.lin.dao;
import com.lin.model.User;
public class UserDAOImpl implements UserDAO{
@Override
public void save(User u) {
System.out.println(u.getName()+"-"+u.getAge()+"被添加!");
}
}
步骤3,
建立service层用来调用DAO层的方法
package com.lin.service;
import com.lin.dao.UserDAO;
import com.lin.model.User;
public class UserService {
private UserDAO userDAO ;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public void save(User u){
userDAO.save(u);
}
}
步骤4
建立配置文件beans.xml
<beans>
<bean id="u" class="com.lin.dao.UserDAOImpl"></bean>
</beans>
写beansspring包里面的一个接口和类来对xml文件进行解析,并且用反射机制来生成和配置文件相对于的实体类并且return
package com.lin.beanspring;
public interface BeanFactory {
public Object getBean(String name);
}
package com.lin.beanspring;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class ClassPathXmlApplicationContext implements BeanFactory {
Map<String,Object> beans = new HashMap<String,Object>();
public ClassPathXmlApplicationContext() throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
Element root = doc.getRootElement();
List list = root.getChildren("bean");
for(int i = 0;i < list.size();i++){
Element element = (Element)list.get(i);
String id = element.getAttributeValue("id");//实例化对象名
String classname = element.getAttributeValue("class");
System.out.println(classname);
Object o = Class.forName(classname).newInstance();
beans.put(id, o);
}
}
@Override
public Object getBean(String name) {
return beans.get(name);
}
}
步骤5
建立测试类用junit4进行单元测试
package com.lin.service;
import java.io.IOException;
import org.jdom.JDOMException;
import org.junit.Test;
import com.lin.beanspring.BeanFactory;
import com.lin.beanspring.ClassPathXmlApplicationContext;
import com.lin.dao.UserDAO;
import com.lin.model.User;
public class UserServiceTest {
UserService userservice = new UserService();
@Test
public void testSave() throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
// User u = new User();
// u.setName("linjian");
// u.setAge(22);
// userservice.save(u);
BeanFactory beanFactory = new ClassPathXmlApplicationContext();
UserDAO userDAO= (UserDAO)beanFactory.getBean("u");
userservice.setUserDAO(userDAO);
User user = new User();
user.setName("hheheheh");
user.setAge(22);
userservice.save(user);
}
}
其中对XML进行解析用到的是jdom.jar,junit测试的建立右击项目新建,不会的就用main方法来测试也是一样。
jdom.jar我上传的资源里有,去百度一搜也可以搜到。