一、IOC容器
控制反转IoC(Inversion of Control),是一种设计思想。传统开发中,需要调用对象的时候,需要调用者手动来创建被调用者的实例,即对象是由调用者new出来的,但是在Spring框架中,创建对象的工作不再由调用者来完成,而是交给IOC容器来创建,再推送给调用者,整个流程完成反转,所以是控制反转。
IOC的特点是解耦合。比如说A需要用到B,传统的开发,我们要直接创建B的实例,但是在Spring中,IOC这个容器会创建B的实例,然后把这个B注入到A。
二、DI
DI(Dependency Injection),指bean之间的依赖注入,设置对象之间的级联关系。实现IOC思想需要DI的支持
1、注入的实现方式
(1)setter方法注入
(2) 构造方法注入
(3) 属性值直接注入(即在定义属性的时候就赋初值)
2.注入类型
(1)值类型注入(8大基本数据类型)
(2)引用类型注入(将依赖的对象注入)
三、BeanFactory
BeanFactory创建对象的工厂(它是一个接口),该工厂采用了延迟加载的思想来创建对象即每次获取对象时才创建一个对象。
1. 延迟加载:是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
(1)优点:
先从单表查询,需要时再从关联表去关联查询,⼤⼤提⾼数据库性能,因为查询单表要比关联查询多张表速度要快。
(2)缺点:
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成⽤户等待时间变长,造成用户体验下降。
(3)在多表中:
一对多,多对多:通常情况下采用延迟加载
一对一(多对一):通常情况下采用立即加载
注意:延迟加载是基于嵌套查询来实现的
四、ApplicationContext容器
Spring在启动时会自动创建配置的相关对象,也就是解析完XML文件后就会创建对象。
五、配置文件详解与对象的创建方法
1. bean标签
表示需要交给Spring容器管理并可通过容器所获取的对象
(1) name属性:表示给被管理的对象所起的名字,名字不唯一,而且可以包含特殊符号,例如$。同时还可以给对象起多个名字,多个名字之间可以使用逗号/分号/空白字符进行分隔。
(2) id属性:和name的作用一样,但是不能使用特殊符号。
(3) class属性:表示被管理的对象所对应的类(完整的包名.类名)
2. alias标签
表示给被管理的对象起别名
(1) name属性:指向的是bean的name值
(2) alias属性:表示别名
六、对象的3种创建方式
1. 通过无参构造方法创建对象
注:如果该类没有无参数的构造方法,则对象创建失败从而抛出异常。
2 .通过静态工厂方式创建对象
3.通过实例工厂方式创建对象
七、对象的作用域
bean标签的scope属性:Singleton(单例)、prototype(多例)、request、session、globalsession(集群),默认为Singleton
request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。
1.Singleton
表示单例,该类型对象在容器创建时创建,是否使用该对象,对象已经存在了
2.prototype
表示多例,容器创建时不会创建该类型对象,只有调用getBean()从容器中获取对象时才创建此类对象
3.Request
作用范围是一次请求和当前请求的转发,表示每次Http请求都会创建一个Bean;
4.Session
表示一次会话,同一个HttpSession共享一个Bean,不同的HttpSession使用不同的Bean。
5.Globalsession
作用范围是一次全局会话。(只有在集群环境下使用Globalsession)。
用的最多的是singleton和prototype。
八、对象的生命周期
一个对象的生命周期一般经过创建、初始化、执行(运行)和销毁等过程。
初始化:在Spring创建这个对象之后调用。
销毁:Spring容器在关闭的时候并销毁容器中的所有对象。
spring容器所管理的对象的生命周期:
1.在单例情况下
(1)当spring容器初始化的时候创建对象
(2)spring容器调用初始化方法
(3)客户端调用该对象的某些方法
(4)关闭容器的时候,由容器执行销毁方法
2.在多例的情况下
(1)当客户从容器获取对象时,由spring容器创建该对象
(2)spring容器调用初始化方法
(3)客户端调用该对象的某些方法
(4)关闭容器的时候,不会调用销毁方法。(当对象长时间不用并且也没有其他对象引用时,由垃圾回收机制销毁对象)。