模拟Spring实现

65 篇文章 0 订阅
4 篇文章 0 订阅

转 http://yuwenlin.iteye.com/blog/2206126

我们知道Spring最主要的就是帮我们管理Service,Dao,还有Action。

今天我们就来模拟一下Spring实现的原理,其实就是解析xml和反射机制。

以用户添加为例,直接上代码:

1.User.java

Java代码   收藏代码
  1. public class User {  
  2.       
  3.     private String username;  
  4.     private String password;  
  5.       
  6.     public String getUsername() {  
  7.         return username;  
  8.     }  
  9.     public void setUsername(String username) {  
  10.         this.username = username;  
  11.     }  
  12.     public String getPassword() {  
  13.         return password;  
  14.     }  
  15.     public void setPassword(String password) {  
  16.         this.password = password;  
  17.     }  
  18.       
  19. }  

 2.UserDAO.java

Java代码   收藏代码
  1. import com.yuwl.model.User;  
  2.   
  3. public interface UserDAO {  
  4.     public void save(User user);  
  5. }  

 3.UserDAOImpl.java

Java代码   收藏代码
  1. import com.yuwl.dao.UserDAO;  
  2. import com.yuwl.model.User;  
  3.   
  4. public class UserDAOImpl implements UserDAO {  
  5.   
  6.     public void save(User user) {  
  7.         //Hibernate or Jdbc add  
  8.         System.out.println("user saved!");  
  9.     }  
  10.   
  11. }  

 4.

Java代码   收藏代码
  1. package com.yuwl.service;  
  2.   
  3. import com.yuwl.dao.UserDAO;  
  4. import com.yuwl.model.User;  
  5.   
  6. public class UserService {  
  7.       
  8.     private UserDAO userDAO;    
  9.       
  10.     public void add(User user) {  
  11.         userDAO.save(user);  
  12.     }  
  13.     public UserDAO getUserDAO() {  
  14.         return userDAO;  
  15.     }  
  16.     public void setUserDAO(UserDAO userDAO) {  
  17.         this.userDAO = userDAO;  
  18.     }  
  19. }  

 5.仿Spring配置文件beans.xml

Java代码   收藏代码
  1. <beans>  
  2.   
  3.     <bean id="u" class="com.yuwl.dao.impl.UserDAOImpl" />  
  4.       
  5.     <bean id="userService" class="com.yuwl.service.UserService" >  
  6.         <property name="userDAO" bean="u"/>  
  7.     </bean>  
  8.       
  9. </beans>  

 6.仿Spring的BeanFactory.java

Java代码   收藏代码
  1. package com.yuwl.spring;  
  2.   
  3. public interface BeanFactory {  
  4.     public Object getBean(String id);  
  5. }  

 7.仿Spring的ClassPathXmlApplicationContext.java

Java代码   收藏代码
  1. import java.lang.reflect.Method;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5. import org.jdom.Document;  
  6. import org.jdom.Element;  
  7. import org.jdom.input.SAXBuilder;  
  8.   
  9. public class ClassPathXmlApplicationContext implements BeanFactory {  
  10.       
  11.     private Map<String , Object> beans = new HashMap<String, Object>();  
  12.       
  13.     public ClassPathXmlApplicationContext() throws Exception {  
  14.         //jdom解析xml  
  15.             SAXBuilder sb=new SAXBuilder();  
  16.         Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));   
  17.         Element root=doc.getRootElement();   
  18.         List list=root.getChildren("bean");  
  19.         for(int i=0;i<list.size();i++){  
  20.            Element element=(Element)list.get(i);  
  21.            String id=element.getAttributeValue("id");  
  22.            String clazz=element.getAttributeValue("class");  
  23.            Object o = Class.forName(clazz).newInstance();  
  24.            beans.put(id, o);  
  25.              
  26.            for(Element propertyElement : (List<Element>)element.getChildren("property")) {  
  27.                String name = propertyElement.getAttributeValue("name"); //userDAO  
  28.                String bean = propertyElement.getAttributeValue("bean"); //u  
  29.                Object beanObject = beans.get(bean);//UserDAOImpl instance  
  30.                  
  31.                String methodName = "set" + name.substring(01).toUpperCase() + name.substring(1);  
  32.                System.out.println("method name = " + methodName);  
  33.                //反射  
  34.                Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);  
  35.                m.invoke(o, beanObject);  
  36.            }  
  37.              
  38.         }    
  39.         
  40.     }  
  41.   
  42.     public Object getBean(String id) {  
  43.         return beans.get(id);  
  44.     }  
  45.   
  46. }  

 8.测试

Java代码   收藏代码
  1. import org.junit.Test;  
  2. import com.yuwl.model.User;  
  3. import com.yuwl.spring.BeanFactory;  
  4. import com.yuwl.spring.ClassPathXmlApplicationContext;  
  5.   
  6. public class UserServiceTest {  
  7.   
  8.     @Test  
  9.     public void testAdd() throws Exception {  
  10.         BeanFactory applicationContext = new ClassPathXmlApplicationContext();  
  11.         UserService service = (UserService)applicationContext.getBean("userService");  
  12.           
  13.         User u = new User();  
  14.         u.setUsername("yuwl");  
  15.         u.setPassword("123456");  
  16.         service.add(u);  
  17.     }  
  18.   
  19. }  

 执行成功:

Java代码   收藏代码
  1. user saved!  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值