Spring-配置文件

本文最后更新于:2022年1月27日 下午

Spring-配置文件解析

Spring框架的主要功能是通过其核心容器来实现的。Spring框架提供的两种核心容器分别是BeanFactoryApplicationContext。创建对象的具体手段是通过反射

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来创建,默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

image-20220126183523139

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的作用域

image-20220126193315397

  • singleton

默认配置:singleton 是 Spring 容器默认的作用域,当一个 Bean 的作用域为 singleton 时,Spring 容器中只会存在一个共享的 Bean 实例,并且所有对 Bean 的请求,只要 id 与该 Bean 定义相匹配,就只会返回 Bean 的同一个实例。

通常情况下,这种单例模式对于无会话状态的 Bean(如 DAO 层、Service 层)来说,是最理想的选择。

  • prototype

使用 prototype 作用域的 Bean 会在每次请求该 Bean 时都会创建一个新的 Bean 实例。因此对需要保持会话状态的 Bean,应该使用 prototype 作用域。

image-20220126184520241

image-20220126184606201

注意: Spring的版本不同,其配置方式也会有所不同,比如上图中通过设置singleton的true或false来设置scope,上图为旧版本,有的版本(新版本)是直接设置scope的值来设置单例或多例,如下图:

image-20220126192824462

Bean实例的创建时机

image-20220126195415894

2.4 Bean的生命周期

简单了解,具体需要深入源码,通过指定init-methoddestroy-method来进行Bean的创建和销毁,需要在Bean的实现类中实现初始化和销毁方法,然后将两个参数名传递给上面两个Bean属性。

Bean实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class userimpl implements user {
public userimpl(){
System.out.println("user create");
}
public void init(){
System.out.println("user init");
}
public void destroy(){
System.out.println("user destroy");
}

@Override
public void login() {
System.out.println("user login");
}
}

xml设置:

1
<bean id="user" class="Pojo.userimpl" scope="singleton" init-method="init" destroy-method="destroy"> </bean>

test测试:

1
2
3
4
5
6
7
8
9
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
user user1 = (user) applicationContext.getBean("user");
System.out.println("user1 "+user1);
//手动关闭核心容器
((ClassPathXmlApplicationContext) applicationContext).close();
}
}

运行结果:

image-20220126201130066

2.5 Bean实例化的三种方式

  • 无参构造方法实例化
  • 工厂静态方法实例化
  • 工厂实例方法实例化

无参构造方法实例化

无参构造方法就是指定bean的class为bean的实例化类的路径,对应的实例化类需要存在无参构造方法。

1
<bean id="user" class="Pojo.userimpl"> </bean>

工厂静态方法实例化

首先需要有一个工厂对象,对象内部存在一个静态方法,通过该静态方法获得bean的实例对象

1
2
3
4
5
public class Factory {
public static userimpl getUser(){
return new userimpl();
}
}

配置文件,指定class为对应的工厂,并设置工厂方法为实现的获取user的静态方法

1
<bean id="user" class="Pojo.Factory" factory-method="getUser"> </bean>

运行结果:

image-20220126204116525

工厂实例方法实例化

顾名思义,就是获取bean的实例化的方法不是工厂类的静态方法,而是普通方法,因此在调用该普通的方法前,需要先获取工厂类的实例化对象,然后通过该对象去调用实例化方法,来获得Bean的实例化对象。

1
2
3
4
5
public class Factory {
public userimpl getUser(){
return new userimpl();
}
}

xml配置,先设置factory的bean,使得Spring可以获取Factory的实例,并调用其实例方法,user 的bean中指定工厂的bean为factory,并且其工厂的实例方法为factory中的获取user实例的方法。

1
2
<bean id="factory" class="Pojo.Factory"> </bean>
<bean id="user" factory-bean="factory" factory-method="getUser"> </bean>

运行结果:

image-20220126204532967


本文作者: 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 协议 ,转载请注明出处!