学习目标

  1. 知道配置元数据的概念
  2. 基于xml的配置元数据的使用
  3. xml配置文件中bean标签的各个定义与使用
  4. Bean后置处理器的用法:实现BeanPostProcessor接口
  5. 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-methoddestroy-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()
该方法在注入的Beaninit方法执行前执行

postProcessAfterInitialization()
该方法在注入的Beaninit方法执行后执行

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>

Demo地址:https://github.com/wayss000/learnSpring/tree/master/SpringBean/src/main/java/pers/wayss/springBean/inheritance

总结

这部分主要需要知道以及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是不一样的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐