1.概念
// 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。
// 其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),
// 还有一种方式叫“依赖查找”(Dependency Lookup)。
// 通过控制反转,对象在被创建的时候,
// 由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。
// 也可以说,依赖被注入到对象中。
//控制反转 把对象的创建和把对象之间的调用过程 交给 spring进行管理
// 目的: 为了耦合度降低
IOC 底层实现原理
// 1. xml 解析 2. 工厂模式 3. 反射
arduino
代码解读
复制代码
//原始方法 一个类调用另一个类的方法 必须通过 new 对象的方式来实现 // 这种 耦合度太高了 比如 某个类 发生了变化 所有需要使用的类 都需要改变
IOC的演变
// 工厂模式
// 在这两个类中间 再创建一个 工厂类 某个类需要的时候另一个类时 就去工厂类里取
// 但是这样也没有把 类与类之间的耦合度 降到最低
less
代码解读
复制代码
// IOC 这种原理 就可以将耦合度 降到最低 // 1. xml 解析 2. 工厂模式 3. 反射 这三个东西 配合 可以实现 // IOC过程 // 第一步创建 xml 配置文件 // <!-- 配置User 对象 创建--> // <bean id="user" class="com.spring.json.User" ></bean> // 第二部 有一个 service类 和dao 类 , 创建工厂类 // class UserFactory{ // public static UserDao get(){ // String classValue = class 属性值; //使用 xml 解析 得到 // Class cla=Class.forName(classValue); // 通过反射 创建对象 // return (UserDao) cla.newInstance(); // // } // } // 进一步 降低 耦合度 比如说 User类 文件位置变了 只需要改变 xml 里的 路径 即可
IOC 接口(BeanFactory)
arduino
代码解读
复制代码
// IOC 思想 基于 ”IOC容器“ 完成 IOC容器底层就是对象工厂 // spring 提供了 IOC容器 实现的两种方式 : // (两个接口) BeanFactory和ApplicationContext // 1. BeanFactory:IOC容器 基本实现 , 是Spring内部接口, 一般不使用这个接口 // **特点**:加载配置文件时 不会创建对象 在使用的时候 才会去创建 // 2. ApplicationContext :是 BeanFactory接口的 子接口 提供了更多的功能 // 一般使用这个 // **特点**: 在加载配置文件时 就会 创建 配置文件中的对象 // web 开发 把一些 慢的 耗时耗资源的 在项目 启动的时候 都加载进来 比较好
IOC 操作 Bean管理 (基于xml)
arduino
代码解读
复制代码
// 什么是 Bean 管理 ? // 0. 指的是 两种操作方式 基于 xml 和基于注解 实现 // 1. Spring 创建对象 // 2. Spring 注入属性 // 基于 xml 方式创建对象
//
//
// 1) 在spring 配置文件中 使用 bean标签 添加对应的属性 可实现 对象创建
// 2)在bean标签 有很多属性
// id属性 : 给对象起个别名 根据这个名字 可以得到这个对象
// class 属性 : 对象的 包路径
// name 属性: 目前没人用了 跟 id 一个性质
// 3) 创建对象的时候 默认也执行 无参数的构造方法
// 特点 如果 声明了 有参构造 需要手动声明 一个无参构造
arduino
代码解读
复制代码
// 基于 xml 方式注入属性 // 1) ID: 依赖注入 , 就是注入属性 是IOC里的一种实现 // 原始 设置属性方法 // 第一种 new 对象 set 方法 来注入属性 // 第二种 通过有参构造 来注入属性 // 基于 xml 方式注入属性
在类文件中声明 set 方法
然后 通过 spring配置文件中 配置 注入属性
在 类文中 声明 属性和有参构造方法
然后 通过 spring配置文件中 配置 注入属性
arduino
代码解读
复制代码
//练习 使用xml 注入 其他类型 属性 // 1. 字面量 : 设置固定值 叫字面量
设置 null 使用 null 标签
设置 属性值 里包含 特殊符号
// 第11节 学习
// 注入属性 外部 bean
//1. 创建两个类 Service 类 和 dao类
//2. 在Service类中 调用 dao类
//传统方式 调用
//创建 UserDao对象
// UserDao userDao=new UserDaoImpl();
// userDao.update();
//spring 方式调用
//在Service类中 创建 一个UserDao 属性 声明 set方法
//在配置文件中 创建 对象 并把 UserDao对象 注入到 service 对象中
测试 :
// 注入属性 内部bean 级联赋值
// 两个实体类中 一对多的关系
// 一个对象 有一个或多个 别的对象定义的属性 就可以使用内部bean 实现
// 在配置文件中 进行相关配置 传值 嵌套写法 和 级联赋值两种写法 达到的效果都一样
举例:
创建一个部门类
创建一个员工类 在员工类中 使用部门属性
配置 xml
测试
arduino
代码解读
复制代码
// 注入集合属性 // 注入 数组类型 属性 /List集合类型属性 /Map集合类型属性
定义一个类 把所有情况列入
配置xml文件
测试
arduino
代码解读
复制代码
// 两个特殊的 问题 //1. 在集合里设置对象类型的值 以上 截图 已经体现了 //2. 把集合注入部分 抽取出来 变成公共部分 让各个类都可以使用
//2.1 首先 在配置文件中引入名称空间 util
//2.2 使用 util 标签完成 list 集合 注入 提取出来
测试