简单手写Spring IOC框架的实现

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 简单手写Spring IOC框架的实现,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Spring IOC

SpringIOC就是把每一个bean与bean之间的关系交给第三方容器进行管理。

底层实现原理

1.读取bean的XML配置文件

2.使用beanId查找bean配置,并获取配置文件中class地址。

3.使用Java反射技术实例化对象

4.获取属性配置,使用反射技术进行赋值。

编码实现

spring.xml

<beans>
	<bean id="user1" class="cn.ybzy.demo.model.User">
		<property name="name" value="小白"></property>
		<property name="address" value="中国"></property>
	</bean>
	<bean id="user2" class="cn.ybzy.demo.model.User">
		<property name="name" value="大白"></property>
		<property name="address" value="上海"></property>
	</bean>
</beans>

使用dom4j解析XML

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>
public class ClassPathXmlApplicationContext {

    private String xmlConfigName;

    public ClassPathXmlApplicationContext(String xmlConfigName) {
        this.xmlConfigName = xmlConfigName;
    }

    /**
     * spring加载过程或者spring ioc实现原理
     *
     * @param beanId
     * @return
     * @throws Exception
     */
    public Object getBean(String beanId) throws Exception {
        //读取xml配置文件
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(xmlConfigName);
        //获取xml解析器
        SAXReader saxReader = new SAXReader();
        //解析器读取配置文件
        Document read = saxReader.read(inputStream);
        //获取跟节点对象
        Element rootElement = read.getRootElement();
        List<Element> elements = rootElement.elements();
        Object obj = null;
        for (Element sonEle : elements) {
            //获取每个bean的名称
            String oneBeanId = sonEle.attributeValue("id");
            if (!beanId.equals(oneBeanId)) {
                continue;
            }
            //获取每个bean的class地址
            String beanClassPath = sonEle.attributeValue("class");
            //拿到class地址 进行反射实例化对象
            Class<?> forName = Class.forName(beanClassPath);
            obj = forName.newInstance();
            //拿到成员属性使
            List<Element> propertys = sonEle.elements();
            for (Element element : propertys) {
                String name = element.attributeValue("name");
                String value = element.attributeValue("value");
                //使用反射api为私有属性赋值
                Field declaredField = forName.getDeclaredField(name);
                //允许设置私有成员赋值
                declaredField.setAccessible(true);
                declaredField.set(obj, value);
            }

        }
        return obj;
    }

    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext appLication = new ClassPathXmlApplicationContext("user.xml");
        Object bean = appLication.getBean("user1");
        User user = (User) bean;
        System.out.println(user.getName() + "----" + user.getAddress());
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137062.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!