【1】首先我们来了解下,什么叫做耦合
耦合:指的是程序之间的依赖关系{包括类之间的依赖和方法间的依赖}
例如,我们常用的new 就是一种耦合,以及一个类调用另一个类中的方法,也是耦合
【2】解耦
解耦:就是降低程序之间的耦合关系,但是并不能消除
在实际的开发中:我们应该做到编译器不依赖,运行期依赖
【3】解决思路
1.使用反射来创建对象,避免使用new关键字
2.通过读取配置文件来获取要创建的对象的全限定类名
我们先创建出一个bean.properties配置文件,以后在Spring中是要用到xml的,这里是测试,所以用properties。
在这里面写上,两个实现类的全限定类名。
因为我们需要进行在类中调用实体类,把new关键字消除的操作。
就需要实例化对象
在工厂类中,我们需要先读取我们的bean.properties文件,然后用load方法读取加载
之后就是实例化我们的实现类对象的代码
这里最重要的一点就是Class.forName的用法,这个方法是返回一个类,然后再 Class.newInstance创建对象,来代替创建对象时的new关键字。
注意:forName中的字符串,必须包含我们所需要创建类的包名和类名
也就是我们bean.properties中写的
这样我们就得到了我们需要的实体类对象
我们返回到我们的service实体类中
同理,我们最后的前端模拟类也可以这么使用
注意:因为我们在工厂中getBean方法中返回的是Object类型,这个都需要强转
这里大家需要知道,这个靠newInstance出来的对象,每次打印的地址值都不同,所以是多例的,如果我们想得到单例的对象,怎么办?
既然我们调用BeanFactory的方法时,每次都是新的对象,那么我们就可以在工厂中,把对象存入到一个容器中,然后每次调用,就从容器中拿就可以了。
这样我们在自定义方法中,就可以,return beans.get(name);即可