wangflood

精心维护一个技术blog,为了工作,也是爱好。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 19 Stories :: 8 Comments :: 0 Trackbacks
 spring IOC达到松耦合的目的,便于测试。我很喜欢"spirng容器"的说法,spring根据读取bean.xml,再用java反射机制,组合一些类,完成程序。其实,实现起来也不太难。不信你看。

模仿spring,BeanFactory
package com.wang.spring;

public interface BeanFactory {
    
public Object getBean(String name);
}


主要类:ClassPathXmlApplicationContext,当然spring的这个类里有国际化等功能实现,这里就简了。
package com.wang.spring;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import wang.spring.dao.UserDao;
import wang.spring.dao.impl.UserDaoImpl;

public class ClassPathXmlApplicationContext implements BeanFactory {

    
private Map<String, Object> beans = new HashMap<String, Object>();

    
// IOC Inverse of Control DI Dependency Injection
    public ClassPathXmlApplicationContext() throws Exception {
        SAXBuilder sb 
= new SAXBuilder();

        Document doc 
= sb.build(this.getClass().getClassLoader()
                .getResourceAsStream(
"beans.xml")); // 构造文档对象
        Element root = doc.getRootElement(); // 获取根元素HD
        List list = root.getChildren("bean");// 取名字为disk的所有元素
        for (int i = 0; i < list.size(); i++{
            Element element 
= (Element) list.get(i);
            String id 
= element.getAttributeValue("id");
            String clazz 
= element.getAttributeValue("class");
            Object o 
= Class.forName(clazz).newInstance();
            System.out.println(id);
            System.out.println(clazz);
            beans.put(id, o);
//i=1  new UserDaoImpl();

            
for (Element propertyElement : (List<Element>) element
                    .getChildren(
"property")) {
                String name 
= propertyElement.getAttributeValue("name"); // 得到userDAO
                String bean = propertyElement.getAttributeValue("bean"); // u
                
//相当于    UserDao u = new UserDaoImpl();
                Object beanObject = beans.get(bean);// UserDAOImpl instance

                String methodName 
= "set" + name.substring(01).toUpperCase()
                        
+ name.substring(1);
                System.out.println(
"method name = " + methodName);

                Method m 
= o.getClass().getMethod(methodName,
                        beanObject.getClass().getInterfaces()[
0]);
                m.invoke(o, beanObject);
            }


        }


    }


    
public Object getBean(String id) {
        
return beans.get(id);
    }


}



posted on 2010-11-14 09:46 wangflood 阅读(277) 评论(0)  编辑  收藏 所属分类: J2EE/SSH

只有注册用户登录后才能发表评论。


网站导航: