Spring-配置文件
本文最后更新于:2022年1月27日 下午
Spring-配置文件解析
Spring框架的主要功能是通过其核心容器来实现的。Spring框架提供的两种核心容器分别是BeanFactory
和ApplicationContext
。创建对象的具体手段是通过反射。
1.Spring核心容器
Spring框架的两个最基本和最重要的包是org.springframework.factory
(主要包含接口BeanFactory)和org.springframework.context
(主要包含接口ApplicationContext)。
Spring IoC框架的主要组件有Beans、配置文件applicationContext.xml、BeanFactory接口及其相关类、ApplicationContext接口及其相关类。
Beans是指项目中提供业务功能的Bean,即容器要管理的Bean。Beans就是一个创建的JavaBean、Java类。
配置文件applicationContext.xml
在Spring中对Bean的管理是在配置文件中进行的。在Spring容器内编辑配置文件管理Bean又叫做Bean的装配,实际上装配就是告诉容器需要哪些Bean,以及容器是如何使用IoC将它们配合起来的。Bean的配置文件就是一个xml文件,一般命名为:applicationContext.xml
配置文件包含Bean的id,类,属性及其值,包含一个< Beans >元素和数个< Bean >子元素。Spring IoC框架可根据Bean的id从Bean配置文件中取的该Bean的类,并生成一个该类的实例对象,继而从配置文件中获取该对象的属性和值。
BeanFactory接口及其相关类
BeanFactory采用了工厂设计模式,即Bean容器模式,负责读取Bean的配置文件,管理对象的生成、加载、维护Bean对象与Bean对象之间的依赖关系,负责Bean的声明周期。
org.springframework.beans.factory.BeanFactory
是一个顶级接口,包含管理Bean的各种方法。org.springframework.beans.factory.xml.XmlBeanFactory
是BeanFactory常用的实现类,根据配置文件中的定义装载Bean,使用方法如下:1
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D:\\WorkSpace\\Spring\\src\\main\\resources\\applicationContext.xml"));
ApplicationContext接口及其相关类
ApplicationContext接口提供高级功能的容器,基本功能与BeanFactory很相似,但还可以提供一些高级功能。
ApplicationContext接口的常用实现类有以下几个:
FileSystemXmlApplicationContext:从文件系统中的XML文件中加载上下文中定义的信息,需要使用系统文件路径,如
D:\\applicationContext.xml
,并且只能在指定的路径中查询。ClassPathXmlApplicationContext:从类路径中的XML文件中加载上下文中定义的信息,把上下文定义的文件当成类路径资源,此时applicationContext.xml文件位于项目的src目录下,如:
1
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
XmlWebApplicationContext:从Web系统中的XML文件加载上下文中定义的信息。
AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建Spring容器,它用来读取注解。
2. 配置文件解析
2.1 Bean标签基本配置
用于配置对象交由Spring来创建,默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
2.2 Bean常用属性
属性 | 描述 |
---|---|
id | Bean 的唯一标识符,Spring 容器对 Bean 的配置和管理都通过该属性完成。id 的值必须以字母开始,可以使用字母、数字、下划线等符号。 |
name | name 属性中可以为 Bean 指定多个名称,每个名称之间用逗号或分号隔开。Spring 容器可以通过 name 属性配置和管理容器中的 Bean。 |
class | 该属性指定了 Bean 的具体实现类,它必须是一个完整的类名,即类的全限定名。 |
scope | 用于设定 Bean 实例的作用域,属性值可以为 singleton(单例) 、prototype(原型) 、request、session 和 global Session。其默认值是 singleton |
constructor-org | <bean> 元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的 index 属性指定构造参数的序号(从 0 开始),type 属性指定构造参数的类型 |
property | <bean> 元素的子元素,用于调用 Bean 实例中的 setter 方法来属性赋值,从而完成依赖注入。该元素的 name 属性用于指定 Bean 实例中相应的属性名 |
ref | <property> 和 <constructor-arg> 等元素的子元素,该元素中的 bean 属性用于指定对某个 Bean 实例的引用 |
value | <property> 和 <constractor-arg> 等元素的子元素,用于直接指定一个常量值 |
list | 用于封装 List 或数组类型的依赖注入 |
set | 用于封装 Set 类型的依赖注入 |
map | 用于封装 Map 类型的依赖注入 |
entry | 元素的子元素,用于设置一个键值对。其 key 属性指定字符串类型的键值,ref 或 value 子元素指定其值 |
init-method | 容器加载 Bean 时调用该方法,类似于 Servlet 中的 init() 方法 |
destory-method | 容器删除 Bean 时调用该方法,类似于 Servlet 中的 destroy() 方法。该方法只在 scope=singleton 时有效 |
lazy-init | 懒加载,值为 true,容器在首次请求时才会创建 Bean 实例;值为 false,容器在启动时创建 Bean 实例。该方法只在 scope=singleton 时有效 |
2.3 Bean的作用域
- singleton
默认配置:singleton 是 Spring 容器默认的作用域,当一个 Bean 的作用域为 singleton 时,Spring 容器中只会存在一个共享的 Bean 实例,并且所有对 Bean 的请求,只要 id 与该 Bean 定义相匹配,就只会返回 Bean 的同一个实例。
通常情况下,这种单例模式对于无会话状态的 Bean(如 DAO 层、Service 层)来说,是最理想的选择。
- prototype
使用 prototype 作用域的 Bean 会在每次请求该 Bean 时都会创建一个新的 Bean 实例。因此对需要保持会话状态的 Bean,应该使用 prototype 作用域。
注意: Spring的版本不同,其配置方式也会有所不同,比如上图中通过设置singleton的true或false来设置scope,上图为旧版本,有的版本(新版本)是直接设置scope的值来设置单例或多例,如下图:
Bean实例的创建时机
2.4 Bean的生命周期
简单了解,具体需要深入源码,通过指定init-method
和destroy-method
来进行Bean的创建和销毁,需要在Bean的实现类中实现初始化和销毁方法,然后将两个参数名传递给上面两个Bean属性。
Bean实例:
1 |
|
xml设置:
1 |
|
test测试:
1 |
|
运行结果:
2.5 Bean实例化的三种方式
- 无参构造方法实例化
- 工厂静态方法实例化
- 工厂实例方法实例化
无参构造方法实例化
无参构造方法就是指定bean的class为bean的实例化类的路径,对应的实例化类需要存在无参构造方法。
1 |
|
工厂静态方法实例化
首先需要有一个工厂对象,对象内部存在一个静态方法,通过该静态方法获得bean的实例对象
1 |
|
配置文件,指定class为对应的工厂,并设置工厂方法为实现的获取user的静态方法
1 |
|
运行结果:
工厂实例方法实例化
顾名思义,就是获取bean的实例化的方法不是工厂类的静态方法,而是普通方法,因此在调用该普通的方法前,需要先获取工厂类的实例化对象,然后通过该对象去调用实例化方法,来获得Bean的实例化对象。
1 |
|
xml配置,先设置factory的bean,使得Spring可以获取Factory的实例,并调用其实例方法,user 的bean中指定工厂的bean为factory,并且其工厂的实例方法为factory中的获取user实例的方法。
1 |
|
运行结果:
本文作者: ziyikee
本文链接: https://ziyikee.fun/2022/01/26/Spring-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!