反射的作用之spring的简单模拟

我们都知道spring框架主要起管理作用,它的核心配置文件时bean.xml,那么他是如何通过配置文件来管理这么多实体类的呢。下面看简单的模拟。代码是跟着马老师敲的。

先建立如图所示框架结构,当然这样写主要是巩固对层次结构的建立,单纯模拟spring的核心主要是ClassPathXmlApplicationContext那个类。


步骤1.

首先建立User实体类,里面有name和age属性,并且生成set,get方法

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.lin.model;  
  2.   
  3. public class User {  
  4.     private String name;  
  5.     private int age;  
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public int getAge() {  
  13.         return age;  
  14.     }  
  15.     public void setAge(int age) {  
  16.         this.age = age;  
  17.     }  
  18.       
  19. }  

步骤2

建立简单的DAO层, 当然具体的jdbc代码就不写了,用一个简单的输出语句来代替。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.lin.dao;  
  2.   
  3. import com.lin.model.User;  
  4.   
  5. public interface UserDAO {  
  6.     public void save(User u);  
  7. }  

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.lin.dao;  
  2. import com.lin.model.User;  
  3.   
  4.   
  5. public class UserDAOImpl implements UserDAO{  
  6.   
  7.     @Override  
  8.     public void save(User u) {  
  9.         System.out.println(u.getName()+"-"+u.getAge()+"被添加!");  
  10.     }  
  11.   
  12. }  

步骤3,

建立service层用来调用DAO层的方法

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.lin.service;  
  2.   
  3. import com.lin.dao.UserDAO;  
  4. import com.lin.model.User;  
  5.   
  6. public class UserService {  
  7.     private UserDAO userDAO ;  
  8.     public UserDAO getUserDAO() {  
  9.         return userDAO;  
  10.     }  
  11.     public void setUserDAO(UserDAO userDAO) {  
  12.         this.userDAO = userDAO;  
  13.     }  
  14.     public void save(User u){  
  15.         userDAO.save(u);  
  16.     }  
  17. }  


步骤4

建立配置文件beans.xml

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <beans>  
  2.     <bean id="u" class="com.lin.dao.UserDAOImpl"></bean>  
  3. </beans>  

写beansspring包里面的一个接口和类来对xml文件进行解析,并且用反射机制来生成和配置文件相对于的实体类并且return

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.lin.beanspring;  
  2.   
  3. public interface BeanFactory {  
  4.     public Object getBean(String name);  
  5. }  


[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.lin.beanspring;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.jdom.Document;  
  9. import org.jdom.Element;  
  10. import org.jdom.JDOMException;  
  11. import org.jdom.input.SAXBuilder;  
  12.   
  13. public class ClassPathXmlApplicationContext implements BeanFactory {  
  14.     Map<String,Object> beans = new HashMap<String,Object>();  
  15.     public ClassPathXmlApplicationContext() throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {  
  16.         SAXBuilder builder = new SAXBuilder();  
  17.         Document doc = builder.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));  
  18.         Element root = doc.getRootElement();  
  19.         List list = root.getChildren("bean");  
  20.         for(int i = 0;i < list.size();i++){  
  21.             Element element = (Element)list.get(i);  
  22.             String id = element.getAttributeValue("id");//实例化对象名  
  23.             String classname = element.getAttributeValue("class");  
  24.             System.out.println(classname);  
  25.             Object o = Class.forName(classname).newInstance();  
  26.             beans.put(id, o);  
  27.         }  
  28.     }  
  29.     @Override  
  30.     public Object getBean(String name) {  
  31.         return beans.get(name);  
  32.     }  
  33.   
  34. }  


步骤5

建立测试类用junit4进行单元测试

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.lin.service;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.jdom.JDOMException;  
  6. import org.junit.Test;  
  7.   
  8. import com.lin.beanspring.BeanFactory;  
  9. import com.lin.beanspring.ClassPathXmlApplicationContext;  
  10. import com.lin.dao.UserDAO;  
  11. import com.lin.model.User;  
  12.   
  13. public class UserServiceTest {  
  14.     UserService userservice = new UserService();  
  15.     @Test  
  16.     public void testSave() throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {  
  17. //      User u = new User();  
  18. //      u.setName("linjian");  
  19. //      u.setAge(22);  
  20. //      userservice.save(u);  
  21.         BeanFactory beanFactory = new ClassPathXmlApplicationContext();  
  22.         UserDAO userDAO= (UserDAO)beanFactory.getBean("u");  
  23.         userservice.setUserDAO(userDAO);  
  24.         User user = new User();  
  25.         user.setName("hheheheh");  
  26.         user.setAge(22);  
  27.         userservice.save(user);  
  28.     }  
  29.   
  30. }  



其中对XML进行解析用到的是jdom.jar,junit测试的建立右击项目新建,不会的就用main方法来测试也是一样。

jdom.jar我上传的资源里有,去百度一搜也可以搜到。

点击打开链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值