通过一步步实现自定义SpringIOC , 降低类的耦合性
前言
早期 JDBC 操作,注册驱动时,我们为什么不使用 DriverManager 的 register 方法,而是采
用 Class.forName 的方式?
原因就是: 我们的类依赖了数据库的具体驱动类(MySQL) ,如果这时候更换了数据库(比如 Oracle) ,
需要修改源码来重新数据库驱动.
解决上述耦合的思路
类与类之间的耦合的根本原因是:在一个类中new了另外一个类的对象
思路 : 不在本类中创建另外一个类的对象, 由Spring 或者其它帮忙创建类
通过反射来注册驱动的,代码如下:
1 | Class.forName("com.mysql.jdbc.Driver");//此处只是一个字符串 |
此时的好处是,我们的类中不再依赖具体的驱动类,此时就算删除 mysql 的驱动 jar 包,依然可以编译(运行无法通过,因为缺少类啊) 。
但是又存在了一个新的问题, mysql 驱动的全限定类名’’字符串’’是在 java 类中写死的(硬编码),当要修改的时候要修改源码。可以使用配置文件配置(XML)解决
自定义解耦版本1
1 | public class UserController { |
上述程序如果出现了异常就会导致整个程序的奔溃,因为耦合性很强
思路 : 使用接口(多态)来进行解耦
1 | //接口 |
自定义解耦版本2
上述代码在主程序中new一个新的对象 , 导致new的类与主程序类形成了强耦合
思路 : 在别的类中new新的对象——新建一个实现工厂
1 | //接口 |
自定义解耦版本3
上述代码存在硬编码问题
思路 : 使用xml配置文件来进行解耦
1 | //接口 |
自定义解耦版本3优化
上述代码中 , 主程序每次调用一个getBean方法就会读取一次配置文件,但是在多人协作时可以独立开发,只要工作者实现目标接口 , 配置xml就能实现类的创建,不影响他人开发
思路 : 让读取的配置文件出现在静态代码块 , 减少资源开销 , 同时将创建的对象存入一个容器中 , 需要时取出即可
1 | //这里只贴工厂类 , 其它不变 |
总结
写到最后颇有点SpringIoc创建对象的感觉 , 也就是Spring创建单例对象的底层吧,哈哈!