Sping IOC原理

Spring的核心思想是什么?
Spring整个系列的最最核心的概念当属IoC, AOP。

sping IOC原理

IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了”主从换位”的变化。
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试; 有了IoC容器后, 把创建对象和查找依赖对象的控制权交给了容器, 由容器进行注入组合对象, 通过容器管理对象的生老病死,所以对象与对象之间是松散耦合, 这样也方便测试, 利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活. 将对象创建过程从编译时延期到运行时,即通过配置进行加载,这样一来就解决了不用编译后期选择具体实现,其实就是面向对象的核心理念,针对接口编程。IoC开始就是个factory加上依赖管理罢了,这样一来,一个系统的创建过程就从原先的new改为配置组装,内部通过注入解决了依赖关系,只要满足接口协议即插即用。通过IoC, AOP事实上形成了一个套路,通过这个套路完成了系统的整合。所以Spring并没有说自己写一个ORM,而是用统一的套路完成了多个ORM的集成,这也是Spring越做越大的基础,慢慢就形成了Spring Way,其实这个才是Spring最有价值的地方。

通过容器进行获取对象时的具体实现:

public class BeanFactory{
     private static final Map<String,Object> pool=new HashMap<>();
public static Object getBean(String key){}
}

当启动Spring框架时,BeanFactory类会自动查找并解析核心配置文件(applicationContext.xml),按照xml文件中的配置使用反射机制创建class所指定的对象类对象,并采用id配置值作为key存放在map容器中;以后需要使用对象时,不是自行编码创建,而是向容器进行获取getBean.

Beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="userDao" class="com.yan.props.OracleUserDao"/>
    <bean id="now" class="java.util.Date"/>
</beans>
DaoFactory.java
package com.yan.xml;

import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/*
 * 工厂类需要将xml文件进行解析,然后构建class所指定的类对象【反射】,并以id作为key值,存放在一个容器中。
 * 当后面需要使用某个对象时,按照id命名从容器中获取对应的对象
 */
public class DaoFactory {
    private static final Map<String, Object> pool = new HashMap<>();
    static {
        try {
            SAXParserFactory fac = SAXParserFactory.newInstance();
            SAXParser parser = fac.newSAXParser();
            parser.parse("src/main/java/beans.xml", new DefaultHandler() {
                public void startElement(String uri, String localName, String qName, Attributes attributes)
                        throws SAXException {
                    if ("bean".equals(qName)) {
                        String id = attributes.getValue("id");
                        String clz = attributes.getValue("class");
                        Object obj;
                        try {
                            obj = Class.forName(clz).newInstance();
                            pool.put(id, obj);
                        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
                            throw new SAXException(e);
                        }
                    }
                }

            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Object getBean(String id) {
        if(pool.containsKey(id))
            return pool.get(id);
        return null;
    }
}
Test.java
package com.yan.xml;

import java.util.Date;

import com.yan.props.IUserDao;

public class Test {
    public static void main(String[] args) {
        IUserDao userdao = (IUserDao) DaoFactory.getBean("userDao");
        userdao.create();

        Date now = (Date) DaoFactory.getBean("now");
        System.out.println(now);
    }
}

猜你喜欢

转载自blog.csdn.net/flower_csdn/article/details/80211100