我们都知道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我上传的资源里有,去百度一搜也可以搜到。