Spring 学习指南 第三章 bean的配置 (未完结)

第三章 bean 的配置

? 在本章中,我们将介绍以下内容:

  1. bean 定义的继承:
  2. 如何解决 bean 类的构造函数的参数:
  3. 如何配置原始类型 (如 int 、float 等) 、集合类型(如 java.util.List、java.util.Map)等以及自定义类型 (如 Address ) 等的 bean 属性和构造函数参数;
  4. 如何通过使用 p 命名空间和 c 命名空间分别指定 bean 属性和构造参数来使用应用程序上下文 XML 文件变得简洁;
  5. Spring 的 FactoryBean 接口,运行编写自己的工厂类来创建 bean 实例;
  6. 模块化 bean 配置。
bean 定义的继承

? 我们在第一章和第二章中看到,应用程序上下文 XML 文件中的 bean 定义指定了 bean 类及其依赖项的完全限定名称。在某些场景下,为了使 bean 定义不那么冗长,你可能希望 bean 定义从另一个 bean 定义继承配置信息。下面介绍 MyBank 应用中这样的一个场景。

MyBank——bean 定义继承实例

? 在上一章中,我们了解到 MyBank 应用通过 DAO 来访问数据库。假设 MyBank 应用定义了一个可以与数据库交互的 DatabaseOperations 类,因此 MyBank 应用中的所有 DAO 都依赖于 DatabaseOperations 类来执行数据库操作,如下图所示。

? 上图展示了 FixedDepositDao 和 PersonalBankingDao 类依赖于 DatabaseOperations 类。以下应用程序上下文 XML 文件展示了这些类的 bean 定义。

<bean id="databaseOperations"
    class="sample.spring.chapter01.bankapp.utils.DatabaseOperations"></bean>

<bean id="personalBankingDao" class="sample.spring.chapter01.bankapp.dao.PersonalBankingDaoImpl">
    <property name="databaseOperations" ref="databaseOperations" />
</bean>

<bean id="fixedDepositDao" class="sample.spring.chapter01.bankapp.dao.FixedDepositDaoImpl">
    <property name="databaseOperations" ref="databaseOperations" />
</bean>

? 上面 xml 中,personalBankingDao 和 fixedDepositDao bean 定义都使用 databaseOperations 属性来引用 DatabaseOperations 实例。这意味着 PersonalBankingDaoImpl 和 FixedDepositDaoImpl 类都定义了一个 setDatabaseOperations 方法,以允许 Spring 容器注入 DatabaseOperations 实例。

? 如果应用程序中的 多个 bean 共享一组公共的配置 (属性、构造函数参数等),则可以创建一个 bean 定义,作为其他 bean 定义的父定义。在 personalBankingDao 和 fixedDepositDao bean定义中,公共的配置是 databaseOperations 属性。下面展示了 personalBankingDao 和 fixedDepositDao bean 定义如何从父 bean 定义继承 databaseOperations 属性。

<bean id="databaseOperations" class="sample.spring.chapter03.bankapp.utils.DatabaseOperations"></bean>

<bean id="daoTemplate" abstract="true">
    <property name="databaseOperations" ref="databaseOperations" />
</bean>

<bean id="fixedDepositDao" parent="daoTemplate" class="sample.spring.chapter03.bankapp.dao.FixedDepositDaoImpl">
</bean>

<bean id="personalBankingDao" parent="daoTemplate"
      class="sample.spring.chapter03.bankapp.dao.PersonalBankingDaoImpl"></bean>

? 在上面的 xml 中,daoTemplate bean 定义了 fixedDepositDao 和 personalBankingDao bean 定义共享的公共配置。由于 fixedDepositDao 和 personalBankingDao bean 定义都需要 databaseOperations 依赖项,daoTemplate bean 定义使用 元素定义 databaseOperations 依赖项。 元素的 parent 属性指定从中继承配置的 bean 定义的名称。由于 fixedDepositDao 和 personalBankingDao bean 定义中的 parent 属性值为 daoTemplate ,因此他们从 daoTemplate bean 定义继承了 databaseOperation 属性。

? 如果 元素的 abstract 特性值设置为 true , 则表示 bean 定义是抽象的。在上面 xml 中, daoTemplate bean 定义是抽象的。请注意,Spring 容器不会尝试创建一个与抽象 bean 定义相对应的 bean 。

注意:
    抽象 bean 不能作为其他 bean 定义的依赖项,也就是说,不能使用 <property> 或 <constructor-arg> 元素来引用抽象  bean 。

? 你可能已经注意到 daoTemplate bean 定义没有指定 class特性。如果父 bean 定义没有指定 class特性,则需要在子 bean 定义 (如 fixedDepositDao 和 personalBankingDao) 中指定 class 特性。注意,如果不指定 class 特性,则必须将 bean 定义为抽象的,以使 Spring 容器不会去尝试创建与之对应的 bean实例。

? 要验证 fixedDepositDao 和 personalBankingDao bean 定义是否继承了 daoTemplate bean 定义的 databaseOperations 属性。请执行下面的 java 代码。BankApp 类的 main 方法调用在 fixedDepositDao 和 personalBankingDao bean 中的方法,而这些 bean 调用 DatabaseOperations 实例上的方法。你会注意到,BankApp 的 main 方法成功运行。没有抛出任何异常。如果没有将 DatabaseOperations 实例注入 fixedDepositDao 和 personalBankingDao bean 中,那么代码将抛出 java.lang.NullPointerException。

package sample.spring.chapter03.bankapp;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import sample.spring.chapter03.bankapp.controller.FixedDepositController;
import sample.spring.chapter03.bankapp.controller.PersonalBankingController;
import sample.spring.chapter03.bankapp.domain.FixedDepositDetails;

public class BankApp {
    private static Logger logger = Logger.getLogger(BankApp.class);

    public static void main(String args[]) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "classpath:META-INF/spring/applicationContext.xml");

        FixedDepositController fixedDepositController = context
                .getBean(FixedDepositController.class);
        fixedDepositController.submit(context
                .getBean(FixedDepositDetails.class).setDepositAmount(100)
                .setEmail("[email protected]").setId(1).setTenure(10));
        logger.info("Your fixed deposit details : " + fixedDepositController.get());

        PersonalBankingController personalBankingController = context
                .getBean(PersonalBankingController.class);
        logger.info(personalBankingController.getMiniStatement());

    }
}

? 下图 显示了 fixedDepositDao 和 personalBankingDao bean 定义中,bean 定义继承是如何工作的

? 上图展示了 fixedDepositDao 和 personalBankingDao bean 定义从 daoTemplate bean 定义继承了 databaseOperations 属性(以 fixedDeopsitDa 和 personalBankingDao 标识的方框中的 property 属性)。上图还描述了 Spring 容器不会尝试创建 与 daoTemplate bean 定义相对应的bean 实例,因为他被标记为 abstract。

继承了什么

? 子 bean 定义从 父 bean 定义继承一下配置信息:

  1. 属性,通过 元素指定。
  2. 构造函数参数,通过 元素指定。
  3. 方法覆盖(见4,5节)
  4. 初始化和销毁方法(见 第五章);
  5. 工厂方法,通过 元素的 工厂方法特性指定(见2,3节,了解静态和实例工厂方法如何用于创建 bean)

原文地址:https://www.cnblogs.com/train99999/p/11964898.html

时间: 2024-10-11 09:22:24

Spring 学习指南 第三章 bean的配置 (未完结)的相关文章

HCNA网络技术学习指南-第三章以太网

一.以太网卡 1.计算机上的网卡,发送信息流程 2.网卡接收信息流程: 知识点: 二.以太网帧 1.MAC地址 2.以太帧的格式 三.以太网交换机 1.交换机的三种转发操作 注:衡量交换机性能的关键性指标:转发能力 2.交换机的工作原理 3.交换机的数据转发示列   都是理论分析,在hcnp中会深入学习,这里就不在赘述.  四.ARP ARP(Address Resolution Protocol)地址解析协议.网络层协议.作用是根据IP地址获取对应的MAC地址. 1.ARP的基本原理 2.AR

CCNA学习指南 第三章 下载

TCP/IP的历史要追溯到20世纪70年代中期,当时的ARPA(AdvancedResearch Projiect Agency-美国国防部高级计划研究局)启动了互联网(Internet)研究项目,该项目最终组建完成的网络系统就被称为了Internet.

『Python』Numpy学习指南第三章__常用函数

感觉心情渐渐变好了,加油! np.eye(2)np.savetxt('eye.txt',i2)c,v = np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) 1 # __*__coding=utf-8__*__ 2 3 import numpy as np 4 5 # 单位矩阵生成 6 i2 = np.eye(2) 7 print(i2) 8 9 # 保存为txt 10 np.savetxt('eye.txt',i2

Spring学习笔记(三)

Spring学习笔记(三) AOP 一.使用Annotation方式实现AOP.步骤: xml里加入配置:<aop:aspectj-autoproxy /> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org

CCNA学习指南 第五章 下载

在一个陌生的环境里如果想到达某一个地点,可以有三种方法:第一种方法请一位向导,只要把你要去的目的地说清楚了,一路上不用操心,向导自然会带你到达.第二种方法找一张相关的地图,按图索骥.第三种方法是朝着目的地的方向边走边问,根据被询问的人提供的信息选择一条最近的路径. CCNA学习指南 第五章 下载

CCNA学习指南 第六章 下载

本章讲述静态路由和动态路由的配置.动态路由协议涉及RIPv1.RIPv2和IGRP,这三个动态路由协议都属于距离矢量型路由协议. CCNA学习指南 第六章 下载

JavaScript学习指南之第一章Hello JavaScript!最基础的JavaScript入门

JavaScript学习指南笔记 第一章 Hello JavaScript! JavaScript简介 JavaScript属于网络端的脚本语言. JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. 能够与网页进行完美的集成.. 目前在因特网领域,也是比较流行的一种脚本语言. JavaScript是一种轻量级的编程语言. JavaScript是可插入HTML页面的编程代码. JavaScript插入HTML页面后,可有所有的浏览器所执行

Shell学习笔记——第三章

第三章 /etc/passwd 文件包含一个所有系统用户账户组成的列表,以及一些关于每个用户的基本信息. 例rich:x:501:Rich Blum:/home/rich:/bin/bash 每个条目都有7个数据字段,例使用冒号分隔.系统使用这些字段中的数据向用户分配具体的特性.这些字段分别有 用户名:用户密码(如果密码存储在其他文件中,则为占位符):用户的系统用户ID编号:用户的系统组的ID编号:用户的全名:用户默认的主目录:用户的默认Shell目录: cd 命令 略过 列表命令(ls) 参数

Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器

关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务器所提供的SQL语句的巨大威力.与此同时,MyBaits消除了书写大量冗余代码的痛苦,它使使用SQL更容易. 在代码里直接嵌套SQL语句是很差的编码实践,并且维护起来困难.MyBaits使用了映射器配置文件或注解来配置SQL语句.在本章中,我们会看到具体怎样使用映射器配置文件来配置映射SQL语句.