Spring学习三:Bean与配置元数据

来源:互联网 发布:先锋电视网络看电视 编辑:程序博客网 时间:2024/06/15 01:21

学习目标

  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是不一样的。

0 0