反转控制与依赖注入
反转控制(IOC inverse of control)
- 控制:对成员变量赋值的控制权
- 反转控制:把对成员变量赋值的控制权从代码中(反转)转移到Spring工厂和配置文件中完成。
- 好处:解耦合
- 底层实现工厂设计模式
从前的控制权在代码里
spring的控制权在配置文件和spring工厂
依赖注入(DI Dependency Injection)
反转控制是一个概念,依赖注入是一种编程方式,需要慢慢体会。
- 注入:通过spring工厂及配置文件,为对象(bean 组件)的成员变量赋值
- 依赖:我需要你=我依赖你。
- 依赖注入:依赖你,就将你作为成员变量注入进来。通过spring配置文件赋值。
- 好处:解耦合。配置文件赋值。
spring工厂创建复杂对象
什么是复杂对象
简单对象:可以直接通过new构造方法创建的对象。
复杂对象:不能直接通过new构造方法创建的对象。
创建复杂对象的3种方式
factoryBean接口
- 实现FactoryBean接口(三个方法)
因为复杂对象的创建方式不一样,所以提供了这样的接口。
- spring配置文件的配置
配置bean标签。简单对象通过bean标签获取的是简单对象。
而class指定类型是factorybean接口的实现类,通过id获得的对象是factorybean所创建的复杂对象。
细节
- 如果就想获得factory对象,getbean时id前加&
- isSingleton方法:返回true只会创建一个复杂对象,返回false每次都会创建新的连接对象。
- mysql高版本需要ssl证书,可以再url中指定不适用ssl
- 依赖注入的体会(DI):上文的链接代码用依赖注入转换。将硬编码的字符串转换为成员变量,加set方法,用sring 配置文件进行注入。
FactoryBean实现原理简易版
问题:
- 为什么要规定FactoryBean接口实现?(接口回调)
- 为什么getbean获得的是复杂对象而不是factoryBean对象?
步骤:
getbean的过程:
1.根据id获得bean标签相关信息,获取对象后判断是不是factorybean的实现类。
2.spring去调用factorybean子类的getobject方法拿到复杂对象。
3.返回复杂对象给客户。
FactoryBean总结
spring中用于创建复杂对象的一种方式,也是spring原生提供的,后续讲解其他框架会大量应用。
实例工厂
- 为什么还需要有实例工厂?避免spring框架的侵入,整合遗留系统。
- 为什么叫实例工厂?因为要先获取实例,然后才能获取对象。
步骤:
- 把已有代码类引入
- 引入新标签 factory-bean factory-method。表明对象来自于原有的factory,需要调用getconn方法获取
静态工厂
区别是什么呢?
避免了一步创建的过程。因为工厂中的get方法是静态的,不需要先创建工厂实例。
配置文件也不需要先写工厂对象的内容,直接写到工厂方法即可
spring 工厂创建对象总结
简单对象:new运算直接创建的 bean标签可以创建
复杂对象:三种方法,开发系统推荐factorybean,遗留系统是实例对象和静态对象。