Spring解析xml实现依赖注入

一、环境准备

引入依赖

        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

相关类

public interface UserDao {
    public void findName();
}

public class UserDaoImpl implements  UserDao{
    @Override
    public void findName() {
        System.out.println("我是dao实现类1");
    }
}

public interface UserService {
    public void findAge();
}
public class UserServiceImpl implements UserService {

    UserDao dao;

    @Override
    public void findAge() {
        System.out.println("我是service的实现类");
        dao.findName();
    }

    public void setDao(UserDao dao) {
        this.dao = dao;
    }
}

配置文件spring.xml

<?xml version="1.0" encoding="UTF-8" ?>

<beans>
    <bea id="dao" class="com.cjx.spring.dao.UserDaoImpl"></bea>
    <bean id="service" class="com.cjx.spring.service.UserServiceImpl">
        <property name="dao" ref="dao"></property>
    </bean>
</beans>

二、关键代码

public class BeanFactory {

    public  BeanFactory(String xml){
        parseXml(xml);
    }

    Map map=new HashMap<String,Object>();//模拟IOC容器

    public void parseXml(String xml)  {

        File file = new File(this.getClass().getResource("/").getPath()+"//"+xml);//获取xml文件
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(file);//获取xml文档
            Element rootElement = document.getRootElement();//获取根元素
            for (Iterator<Element> itFirst = rootElement.elementIterator(); itFirst.hasNext();) {//变量根元素下的元素,也就是第一层子标签
                Element elementFistChild = itFirst.next();
                // do something
                /*
                第一步实例化对象
                 */
                Attribute attributeId = elementFistChild.attribute("id");//获取属性id中的填写的信息
                String beanName = attributeId.getValue();
                Attribute aClass = elementFistChild.attribute("class");//获取属性class属性中的信息
                String clazzName = aClass.getValue();
                Class clazz = Class.forName(clazzName);
                Object instance = clazz.newInstance();//实例化
                /*
                    第二步维护依赖
                    判断这个对象是否有依赖 (判断是否有property,判断类是否有属性)
                    如果有就注入d
                 */

                for (Iterator<Element> itSecon = elementFistChild.elementIterator(); itSecon.hasNext();){//第二层
                    Element elementSecondChild = itSecon.next();
                    System.out.println(elementSecondChild.getName());
                    if (elementSecondChild.getName().equals("property")) {
                        String refValue= elementSecondChild.attribute("ref").getValue();
                        Object injetObject = map.get(refValue);//需要注入的对象
                        String nameValue= elementSecondChild.attribute("name").getValue();
                        Field field = clazz.getDeclaredField(nameValue);
                            field.setAccessible(true);
                            field.set(instance,injetObject);
                    }
                }
                map.put(beanName,instance);//放入IOC容器中
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(map);
    }
    public Object getBean(String beanName){
        return map.get(beanName);
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        BeanFactory beanFactory = new BeanFactory("spring.xml");
        UserService service= (UserService) beanFactory.getBean("service");
        service.findAge();
    }
}

测试通过,得到预料的结果
在这里插入图片描述
总结:上面使用的是setter方式注入的,构造注入的方式也是如此。代码中解析代码是最简单版本,spring中在xml中的解析是做了非常多的判断的。ioc容器实际应用也是比较复杂的,并不是仅仅的是一个map就可以搞定的。通过一个简单的案例解析spring通过xml注入依赖的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值