一.问题引入
某天业务层某个类文件需要替换成新的类文件。那么,控制层中的所有调用该业务代码的全部需要换成新的业务类
如:我们在controller层A类中使用到了service层的B类的test方法,要是我们需要将 service层的B类替换成C,那么我们需要将A中所有的B都改成C。要是只有一个A类的B要替换成C,那我们直接替换就好了(不整这些花里胡哨的),但是要是有A1,A2,A3…都需要将B替换成C,那岂不是要一个一个的改。
二.原因和解决方法
(1)原因:主要是A和B之间存在的依赖,专业点来讲就是A,B之间的耦合性高的问题。
(2)解决:我们通常解决耦合性高的问题使用的方法是什么呢?就是将直接的变成间接的,那么我们可以在A调B的时候,引入一个O,那么此时是不是就A->O->B,这样就变成A间接调用B了,这个时候我们的O就是我们Spring IOC容器。
(3)作用:Spring IOC ,实现了层与层之间的解耦
问题:A->O->B,这样A与O,O与B的耦合性不也高吗?这还由一个耦合性高变成了两个,得不偿失啊兄嘚!
这个问题的关键是什么?我们想想,我们是不是要将B替换成C,我们是要改变B,所以不能让他们的耦合性那么高,这样不利于我们维护,但是我们增加的O是Spring IOC jar包的类,我们需要改动吗?不怎么需要(可能需要改动配置文件),这样我们就不用考虑A->O,O->B之间的耦合性了。
三.Spring IOC 实现
我们创建类有两种方法,一种是用关键字new 来创建对象,一种是通过xml配置文件来创建对象。这里我们没办法使用new来创建对象,所以我们通过配置文件。
我们就可以通过Spring启动加载Bean去创建我们的对象然后通过映射将创建好的对象映射到我们的spring容器中。然后我们就能在容器中直接使用我们的已经创建的好的对象了。
回到问题,我们怎么通过ioc来对A,B解耦呢?我们spring容器中已经有了id:b->BService的对象,这个时候我们是不是通过 A->O(BService)->B,就能在A中使用B了,此时我们要想将B替换成C那我们是不是可以通过A->O(CService)->C,这这样我们就能在A中调用到C了。
那此时我们的图应该是怎么样的呢?
我们只需要将原来Bean id为b的指向C,那么我们是不是就不用改变A类的代码,直接就能在A中调用C了,这样是不是就美滋滋了。
四.Spring IOC 创建对象介绍
(1)构造器构建
直接初始化赋值
<bean id="B" class="com.wq.B">
<constructor-arg index="0" name="name" type="java.lang.String" value="123"/>
</bean>
(2)get/set方法
标签用来对对象属性赋值(前提是一定要有get/set方法)
如下实例就是,创建B对象,并用对B的属性name进行赋值
<bean id="b" class="com.wq.B">
<property name="name">
<value >123</value>
</property>
</bean>
(3)工厂创建
当我们创建B需要先有D
如 D d = new D();
B b = new B(d);
a.动态工厂
<bean id="BFactory" class="com.wq.BFactory"></bean>
<bean id="b" factory-bean="BFactory" factory-method="method">
b.静态工厂
<bean id="BFactory" class="com.wq.BFactory" factory-method="StaticMethod"></bean>
<bean id="b" factory-bean="BFactory" factory-method="StaticMethod">
四.Spring DI 依赖注入
B中的属性有D类使用ref 属性
<bean id="b" class="com.wq.B" ref="d"></bean>
<bean id="d" class="com.wq.d"></bean>
也可以是使用type 使用自动注入:
autowire=“byName” 通过bean的id自动注入
autowire=“byType” 通过bean的类型自动注入
autowire=“constructor” 通过构造器自动注入
autowire=“no” 不使用
autowire=“default” 使用默认 (通过全局配置)
<bean id="b" class="com.wq.B" autowire="byName"></bean>
<bean id="d" class="com.wq.d"></bean>
五.结束
以前一开始学的时候,老师讲的不懂就是不懂,不懂就过去以至后来面试官问到时一句不是很了解就结束了。感谢jason面试官让我回去再看看这些基础,当我再回去把这些基础的再看看,发现自己以前不了解的不懂的,在回去在学一边,发现原来是这么回事。接下来有时间我会持续更新,顺便也自己做做笔记。