学习目标
- 知道配置元数据的概念
- 基于xml的配置元数据的使用
- xml配置文件中bean标签的各个定义与使用
- Bean后置处理器的用法:实现BeanPostProcessor接口
- xml配置文件中定义Bean的继承
概述
之前学习了Spring的IoC容器,这个容器容的就是Java Bean。所以,需要对Java Bean进行学习。
Bean的定义
在Java中一个类每个属性都具有set和get方法,就认为这个Java对象是个Bean。
而在一个项目中,有那么多的类,是如何知道Bean的呢?这就需要引入Spring的配置元数据概念:向Spring容器提供相关信息,以便实例化Bean,并指定如何对这些Bean进行装配。所提供的信息称为配置元数据(configuration metadata)。
Spring支持三种格式的配置元数据:
- 基于Java
- 基于注解(annotation)
- 基于XML
这篇笔记只讲基于XML的配置元数据。即,xml格式的配置文件。
配置文件中的bean标签具有以下属性:
属性 | 描述 |
---|---|
class | 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。 |
id | 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。 |
scope | 这个属性指定由特定的 bean 定义创建的对象的作用域,它将会在 bean 作用域的章节中进行讨论。 |
constructor-arg | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
properties | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
autowiring mode | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
lazy-initialization mode | 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。 |
init-method | 在 bean 的所有必需的属性被容器设置之后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
destroy-method | 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
举例如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 最简单的定义,id和class都不可少 -->
<bean id="..." class="...">
<!-- bean内部的属性(比如设值注入等) -->
</bean>
<!-- bean的懒加载模式 -->
<bean id="..." class="..." lazy-init="true">
<!-- 内部属性,没有可以不在这里填东西 -->
</bean>
<!-- 指定默认初始化方法的bean,在初始化这个bean之前,会先执行这个bean类中init-method指定的方法。(如果这里init-method指定了,但实际的类中没有指定的方法,会报错) -->
<bean id="..." class="..." init-method="...">
</bean>
<!-- 指定bean销毁时要做的事,在bean的声明周期最后,会执行这个bean类中destroy-method指定的方法,bean类中没有的话也会报错 -->
<bean id="..." class="..." destroy-method="...">
</bean>
</beans>
Bean的作用域
在Bean的定义中,有个scope属性,这个属性表示这个Bean对象的作用域。
Spring支持5中作用域,分别如下:
作用域 | 描述 |
---|---|
singleton | 该作用域将 bean 的定义的限制在每一个 Spring IoC 容器中的一个单一实例(不指定时的默认)。 |
prototype | 该作用域将单一 bean 的定义限制在任意数量的对象实例。 |
request | 该作用域将 bean 的定义限制为 HTTP 请求。只在 web-aware Spring ApplicationContext 的上下文中有效。 |
session | 该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。 |
global-session | 该作用域将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。 |
所用于singleton和prototype对所有Bean对象均使用,后面3者只对Web应用有效。
练习路径为:https://github.com/wayss000/learnSpring/tree/master/SpringBean
Bean生命周期
理解 Spring bean 的生命周期需要知道,当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当 bean 不再需要,并且从容器中移除时,可能需要做一些清除工作。
这里注意xml配置Bean时,init-method
和 destroy-method
属性,它们分别表示在Bean初始化时和销毁Bean时需要做的事。
同时这俩也对应两个注解@PostConstruct
和@PreDestroy
Bean的后置处理器
实现BeanPostProcessor接口提供的方法,然后就可以配置和初始化一个bean之后实现一些自定义逻辑回调方法了。
可以配置多个BeanPostProcessor接口。
ApplicationContext 会自动检测由 BeanPostProcessor 接口的实现定义的 bean,注册这些 bean 为后置处理器,然后通过在容器中创建 bean,在适当的时候调用它。
练习地址:https://github.com/wayss000/learnSpring/tree/master/SpringBean/src/main/java/pers/wayss/springBean/postProcessor
InitHelloPostProcessor类实现了BeanPostProcessor接口中的两个方法,分别是:
postProcessBeforeInitialization()
该方法在注入的Bean的init方法执行前执行
postProcessAfterInitialization()
该方法在注入的Bean的init方法执行后执行
Bean的继承
Java中用extends可以实现继承,在Spring的Bean中也有继承,并且这个继承和Java中的继承是不一样的。
下面是一个Bean继承模板的实例(摘自极客学院)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Bean的抽象模板,不能被实例化 -->
<bean id="beanTeamplate" abstract="true">
<property name="message1" value="Hello World!"/>
<property name="message2" value="Hello Second World!"/>
<property name="message3" value="Namaste India!"/>
</bean>
<!-- helloIndia继承了beanTeamplate中的property配置,并实现了message1和message3的配置 -->
<bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="beanTeamplate">
<property name="message1" value="Hello India!"/>
<property name="message3" value="Namaste India!"/>
</bean>
</beans>
总结
这部分主要需要知道以及5个概念和使用:
1. 知道配置元数据的概念,即,Bean初始化时所需要的配置参数,常用的3中配置元数据的方法:基于Java、基于注解、基于xml(常用)。
2. 基于xml的配置元数据的使用,用ApplicationContext类来获取xml中设置的Bean初始化信息。
3. xml配置文件中bean标签的各个定义与使用,需要记住相关单词。
4. Bean后置处理器的用法:实现BeanPostProcessor接口,知道
postProcessAfterInitialization()和postProcessBeforeInitialization()方法的执行顺序。
5. xml配置文件中定义Bean的继承,xml的bean标签的abstract=true表示其为一个抽象Bean,需要注意,Spring中的抽象Bean和Java中的抽象Bean是不一样的。