一、IOC:Inversion of Control 控制反转.
指的是 对象的创建权反转(交给)给 Spring. 作用是实现了程序的解耦合.
二、ioc(控制反转)底层原理
1、传统方式开发,原始调用类中的方法
对于如下类及其方法
1 2 3 4 5 6
| public class ClassName{ //方法 public void methodName(){ //...... } }
|
若要调用方法methodName(),原始的做法都是先new一个对象,再用该对象调用类中的方法,即
1 2
| ClassName obj = new ClassName(); obj.methodName();
|
缺陷:耦合度太高
2、利用工厂模式解耦合
工厂模式
1 2 3
| public class Factory{ public static }
|
3、通过IOC把对象的创建交给spring进行管理
第一步;创建xml文件
第二部: 创建工厂类(使用dom4j解析配置文件 + 反射)
1 2 3 4
| //使用dom4j解析配置文件
//使用反射创建类对象 class clazz = Class.forName()
|
三、Spring 中的工厂
通过工厂创建bean对象
基本思路是:解析配置文件(配置文件中是类的唯一标识和全限定类名),利用反射创建实例对象,然后将该标识和获得的对象分别作 key 和 value 封装到 Map 中。
最后在静态方法中通过给定的唯一标识获取对应的 value 对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public class BeanFactory { //定义一个Properties对象 private static Properties props; //定义一个Map,用于存放我们要创建的对象。我们把它称之为容器 private static Map<String,Object> beans; //使用静态代码块为Properties对象赋值 static { try { //实例化对象 props = new Properties(); //获取properties文件的流对象 InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"); props.load(in); //实例化容器 beans = new HashMap<String,Object>(); //取出配置文件中所有的Key Enumeration keys = props.keys(); //遍历枚举 while (keys.hasMoreElements()){ //取出每个Key String key = keys.nextElement().toString(); //根据key获取value String beanPath = props.getProperty(key); //反射创建对象 Object value = Class.forName(beanPath).newInstance(); //把key和value存入容器中 beans.put(key,value); } }catch(Exception e){ throw new ExceptionInInitializerError("初始化properties失败!"); } }
/** * 根据bean的名称获取对象 * @param beanName * @return */ public static Object getBean(String beanName){ return beans.get(beanName); }
|
比如,bean.properties如下:
userDao 和 userService 是所提供的对象id标识,可根据个人喜好随意命名
gavino.spring.dao.impl.UserDaoImpl 和 gavino.spring.service.impl.UserServiceImpl 是类的全限定类名。
1 2
| userDao=gavino.spring.dao.impl.UserDaoImpl userService=gavino.spring.service.impl.UserServiceImpl
|
四、DI :Dependency Injection
依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去。