Spring (一)
IoC
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。
常规代码和控制反转代码的区别
- 常规代码
- 控制反转
目的
解耦:降低程序各个部分之间的依赖度,能够确保如果哪一个部分如果出现错误,依然能够成功编译,但是运行无法通过。
耦合度只能降低,并不能完全消除。
Spring的核心容器ApplicationContext的常用实现类
-
ClassPathXmlApplicationContext:
可以加载***类路径下***的配置文件,要求配置文件必须在类路径下(更常用)
-
FileSystemXmlApplicationContext:
可以加载磁盘任意路径下*的配置文件,*但是必须有访问权限
-
AnnotationConfigApplication
读取注解创建容器
ApplicationContext和BeanFactory两个接口的区别
-
ApplicationContext:更适合单例对象使用
在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说只要一读取完配置文件马上就创建配置文件中的对象
-
BeanFactory:更适合多例对象使用
在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。什么时候需要根据id获取对象,什么时候创建对象
Spring创建Bean的三种方式
-
第一种方式:使用默认的构造函数
在Spring的配置文件中使用bean标签,写好id和class属性之后,且没有其他属性和标签时,采用默认构造函数创建bean对象,如果类中没有默认构造函数,则对象无法创建。
-
第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
<bean id="" factory-bean="" factory-method=""/>
-
第三种方法:使用工厂类中的静态方法创建对象(使用某个类中的静态方法创建按对象,并存入spring容器)
<bean id="" class="" factory-method=""/>
Bean对象的作用范围
-
Spring创建的Bean对象,默认为单例
scope属性取值:
singleton:单例(默认)
prototype:多例的
request:作用于web应用的请求范围
session:作用于web应用的会话范围
global-session:作用于集群环境的会话范围(全局会话范围),不是集群环境,和session无异
Bean生命周期
- 单例对象
- 当容器创建时,对象被创建
- 容器还在,对象就不会消失
- 容器销毁,对象被销毁
- 多例对象
- 使用时spring创建
- 对象被使用时不会被销毁
- 当对象长时间不使用,且没有其他对象引用时,由java垃圾回收器回收
依赖注入
依赖关系的管理:
以后都交给spring来维护,在当前类需要用到其他类的对象,由spring来为我们提供,我们只需要在配置文件中说明依赖关系的维护。
- 能注入的数据有三类:
- 基本类型和String
- 其他bean类型(配置文件中或注解配置或注解配置过的bean)
- 复杂类型/集合类型
- 注入方式:
- 使用构造函数
- 使用set方法
- 使用注解提供
构造函数注入
使用标签:constructor-arg
标签出现的位置:bean标签的内部
标签中的属性
- type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
- index:指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始的
- name:用于指定给构造函数中指定名称的参数赋值
- value:用于给基本类型和string类型数据赋值
- ref:用于指定其他的bean类型数据。指的是在spring的IoC容器中出现过的bean对象
作用:在获取bean对象时,使用bean对象的构造方法
Set方法注入(更常用)
涉及的标签:property
出现位置:bean内部
属性:
- name:用于指定注入时的调用的set方法名称
- value:用于给基本类型和string类型数据赋值
- ref:用于指定其他的bean类型数据。指的是在spring的IoC容器中出现过的bean对象
创建对象时没有明确的限制,可以直接使用默认构造函数
复杂类型注入(集合,properties等)
在标签内部加入对应复杂类型的标签,值用填充
用于给List结构集合注入的标签
list array set
用于给Map结构集合注入的标签
map props
结构相同, 标签可以互相替换
map集合
props使用***