【Spring学习笔记】4.实现一个极简的IoC容器

实现极简容器

第一个, maven依赖

<dependencies>
    <!--Dom4j是Java的XML解析组件-->
    <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.1</version>    
    </dependency>
    <!--Jaxen是Xpath表达式解释器-->
    <dependency>
        <groupId>jaxen</groupId>
        <artifactId>jaxen</artifactId>
        <version>1.1.6</version>    
    </dependency>
</dependencies>

第二个, 新建Apple类

public class Apple{
    private String title;
    private String color;
    private String origin;
    ...setter getter
}

第三个, 在xml中配置

<beans>
    <bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple" >
        <property name="title" value="红富士" />
        <property name="color" value="红色" />
        <property name="origin" value="欧洲" />
    </bean>
</beans>

第四个, 新建接口ApplicationContext

public interface ApplicationContext {
    public Object getBean(String beanId);
}

第五个, 创建一个类, 继承自ApplicationContext, 分析xml并实例化对象

public class ClassPathXmlApplicationContext implements ApplicationContext {
    private Map iocContainer = new HashMap();
    public ClassPathXmlApplicationContext() {
        try{
            String filePath=this.getClass().getResource("/applicationContext.xml");
            filePath=new URLDecoder().decode(filePath,"UTF-8");
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File(filePath));
            List<Node> beans = document.getRootElement().selectNodes("bean");
            for(Node node : beans){
                Element el = (Element) node;
                String id=ele.attributeValue("id");
                String className=ele.attributeValue("class");
                Class.forName(className);
                Object obj=c.newInstance();
                List<Node> properties = ele.selectNodes("property");
                for(Node p : properties){
                    Element property = (Element) p;
                    String name = property.attributeValue("name");
                    String propValue = property.attributeValue("value");
                    String setMethodName = "set"+propName.substring(0,1).toUpperCase()+propName.substring();
                    Method setMethod = c.getMethod(setMethodName, String.class);
                    setMethod.invoke(obj,propValue);
                    
                }
                iocContainer.put(id,obj);
            }
        }catch(Exception e){
            e.printStackInfos();
        }
    }
    public Object getBean(String beanId){
        return iocContainer.get(beanId);
    }
}

第六个, 主方法

public static void main(String[] args){
    ApplicationContext context = new ClassPathXmlApplicationContext();
    Apple apple = (Apple) context.getBean("sweetApple");
    System.out.println(apple);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值