Spring IoC 自定义简单实现案例

该文展示了一个简单的IoC(控制反转)容器的实现,通过Java和XML配置文件管理对象及其依赖。首先引入了Dom4j和Jaxen作为解析XML的依赖,然后定义了ApplicationContext接口,接着创建了XML配置文件描述对象的属性。在ClassPathXmlApplicationContext类中解析XML,通过反射和setter方法注入数据到对象。最后,Apple类作为示例实体类被容器管理并从ApplicationContext获取。
摘要由CSDN通过智能技术生成

IoC 极简实现案例

1.引入依赖

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

2.ApplicationContext 接口

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

3.applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="sweetApple" class="com.mkyuan.ioc.entity.Apple">
        <property name="title" value="红富士"></property>
        <property name="color" value="红色"></property>
        <property name="origin" value="欧洲"></property>
    </bean>
</beans>

4.ClassPathXmlApplicationContext 类

public class ClassPathXmlApplicationContext implements ApplicationContext {
    private Map iocContainer = new HashMap();

    public ClassPathXmlApplicationContext() {
        try {
            String filePath = this.getClass().getResource("/applicationContext.xml").getPath();
            filePath = URLDecoder.decode(filePath, "UTF-8");
            SAXReader reader = new SAXReader();
            Document document = reader.read(filePath);
            List<Node> beans = document.getRootElement().selectNodes("bean");
            for (Node node : beans) {
                Element ele = (Element) node;
                String id = ele.attributeValue("id");
                String className = ele.attributeValue("class");
                Class c = Class.forName(className);
                Object obj = c.newInstance();
                List<Node> properties = ele.selectNodes("property");
                for (Node property : properties) {
                    Element elementProperty = (Element) property;
                    String propName = elementProperty.attributeValue("name");
                    String propValue = elementProperty.attributeValue("value");
                    String setMethodName = "set"+ propName.substring(0,1).toUpperCase()+propName.substring(1);
                    System.out.println("准备执行"+setMethodName+"方法注入数据");
                    Method setMethod = c.getMethod(setMethodName, String.class);
                    setMethod.invoke(obj,propValue);//通过setter方法注入数据
                }
                iocContainer.put(id,obj);
            }
            System.out.println(iocContainer);
            System.out.println("Ioc 初始化完毕");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public Object getBean(String beanId) {
        return iocContainer.get(beanId);
    }
}

5.Apple 类

package com.mkyuan.ioc.entity;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Apple {
    private String title;
    private String color;
    private String origin;
}

6.Application 类

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext();
        Apple sweetApple = (Apple) context.getBean("sweetApple");
        System.out.println(sweetApple);
    }
}

7.执行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值