二刷能变强系列-Spring IOC

一.问题引入

某天业务层某个类文件需要替换成新的类文件。那么,控制层中的所有调用该业务代码的全部需要换成新的业务类
如:我们在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面试官让我回去再看看这些基础,当我再回去把这些基础的再看看,发现自己以前不了解的不懂的,在回去在学一边,发现原来是这么回事。接下来有时间我会持续更新,顺便也自己做做笔记。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值