SpringIOC
即 Inversion of Control,缩写为 IOC,就是由 Spring IoC 容器管理对象,而非传统实现中由程序代码直接操控.
-
使用IOC容器管理bean(IOC)
-
在IOC容器中将有依赖关系的bean进行关系绑定
最终达到的目的:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean一旦有依赖关系,也是已经绑定了的。
为什么要使用IOC?
因为我们之前写的代码,耦合度是偏高的,例如我们的一个项目中,对类进行了改变,那么调用它创建这个对象的地方也需要改变,这就导致了一系列问题,重新测试、重新部署、重新编译、重新发布,这些都是有成本的。所以我们就追求一种低耦合高内聚的方式。
解决方式::使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象;
从 BookDao bd = new BookDao();
转为 BookDao bd ;
这种思想就称为IOC(Inversion of Control),控制反转,意思就是创建对象这件事代码不要做了,对象的控制权由程序转移到外部,这种思想称为控制反转
IOC与DI的最终目的?
IOC与DI的主要目的只有一个:充分解耦
spring如何实现IOC和DI思想?
-
spring提供了一个容器,称为IOC容器,用来充当IOC思想的“外部”,这个容器就是Core Container;
-
IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean
-
当类中还使用了其他类时,容器中建立bean与bean之间的依赖关系的整个过程,称为DI(Dependence Injection)依赖注入。
多个关联使用的bean,IOC容器直接给你绑定好,绑定的这个过程,叫做依赖注入。
一些常见问题:
IOC管理的是什么?(Service和Dao)
如何将被管理的对象告知IOC容器? (通过配置)
被管理的对象交给IOC容器,如何获取到IOC容器?(通过接口)
IOC容器得到后,如何从容器中获取bean?(接口方法)
使用spring导入哪些坐标?pom.xml
spring具体如何实现IOC和DI?
总体来说分为两种方式:XML配置文件 和 注解实现
1.基于XML管理
我们在spring.xml中对bean进行管理,在beans中我们对每一个需要使用的对象进行管理配置
(1)bean是什么?
bean指的是spring管理的对象,与我们自己new的对象不一样,spring可以对其添加额外功能。
bean中的属性介绍:
-
id: 生成的对象名class 全类名
-
name: 对象别名,可以为多个,用空格或“,”或”;“隔开即可,但是我们还是建议使用id
-
scope: 定义创建的bean有几个
-
singleton(默认值):在 Spring 中只存在一个 bean 实例, 单例模式.
为什么要默认单例?
因为spring帮我们管理的对象例如dao和service都是可以复用的,我们并不需要每次都创建一个新的
哪些是适合交给容器进行管理的bean?
造一次就可以反复用的:
表现层对象
业务层对象
数据层对象
工具对象
那些是不适合交给容器管理的bean?
封装实体的域对象
-
prototype:原型getBean()的时候都会 new Bean()
-
request:每次 http请求都会创建一个 bean, 仅用于 WebApplicationContext环境
-
session:同一个 httpsession 共享一个 Bean, 不同 Session 使用不同的 Bean, 使用环境同上
创建对象时注入数据的方式:
set 方法注入 :在set方法中进行注入
构造方法注入:在bean中进行注入
<bean id="admin" class="com.ffyc.spring.model.Admin"> <property name="account" value="1"></property> <property name="id" value="2"></property> </bean>
property是为这个bean对象的属性赋值或者是依赖注入,name表示具体的哪个属性,ref表示参照对应哪个bean(依赖注入),value设置默认值(基本类型时)
(2)我们在xml文件中配置完bean后,要怎么使用呢?
编写一个类,通过刚才的配置文件获取IOC容器,然后通过容器获取对象即可。
(3)bean是如何创建出来的?
实例化bean的三种方式:
1.提供可访问的构造方法
其实就是在类中提供无参构造即可
bean本质上还是对象,spring创建bean也是使用无参构造方法创建
我们把构造方法私有化以后,容器还是可以调用构造方法创建对象,要知道我们以前new对象的时候,private的构造方法是肯定不行的,那么spring是通过什么调用的呢?答案就是反射机制
2.使用静态工厂实例化bean
首先需要创建一个工厂用来生产bean,然后在配置文件中将工厂配置进去,让spring来管理工厂
(注:早期经常通过工厂方式解耦)
3.实例工厂初始化bean
4.spring特意对方式3进行了优化,有标准的实现
(4)bean的生命周期?
生命周期:从创建到消亡的完整过程
bean生命周期:bean从创建到销毁的整个过程
-
初始化容器
-
创建对象(内存分配)
-
执行构造方法
-
执行属性注入(set操作)
-
执行bean初始化方法
-
-
使用bean
执行业务操作
-
关闭/销毁容器
执行bean销毁方法
(5)bean生命周期控制 ?
生命周期控制就是在bean创建后到销毁前做一些事情 。
(6)依赖注入(DI)的实现(手动实现)
DI就是当类中还使用了其他类时,容器中建立bean与bean之间的依赖关系的整个过程,称为DI(Dependence Injection)依赖注入。(其实就是为这个类赋初值)
1.setter方法注入
先写set方法:
然后进行配置:
2.构造器注入
先写构造方法:
然后进行配置:
注入方式的选择:
总之:自己写建议使用setter,第三方技术视情况而定,构造器注入是比较严谨的
(7)第三方bean管理
上面我们管理的bean都是我们自己创建的类,那么如果要管理外部的第三方类,就是从maven中导入的类时,应该怎么操作呢?
其实也是对bean进行配置,将管理权交给IOC容器管理,然后进行依赖注入(赋初值)即可。
例如与数据库连接的对象:
前提是先导入maven包,然后在配置文件中进行配置
以上就是我们使用xml配置应该注意的问题~