Spring 简化装配Bean的配置方式

简化配置方式

Spring 为字面值、引用 Bean 和集合都提供了简化的配置方式。如果没有用到完整配置格式的特殊功能,用户大可使用简化的配置方式。下面分别为上面提及的配置内容给出简化前和简化后的版本。

1.字面值属性

  简化前 简化后
字面值属性
<property name="maxSpeed">
  <value>200</value>
</property>

<property name="maxSpeed" value="200"/>
构造函数参数
<constructor-arg type="java.lang.String">
  <value>红旗CA72</vaIue>
</constructor-arg>

<constructor-arg type="java.lang.String" value="红旗CA72"/>
集合元素
<map>
  <entry>
    <key><vaIue>AM</value></key>
    <value>会见客户</value>
  </entry>
</map>


<map>
  <entry key="AM" value="会见客户"/>
</map>

如果使用简化的方式,则将无法使用 <![CDATA[ ]]> 处理XML特殊字符,只能用XML转义序列对特殊字符进行转换。

2.引用对象属性

  简化前 简化后
字面值属性
<property name="car">
  <ref bean="car"></ref>
</property>

<property name="car" ref="car"/>
构造函数参数
<constructor-arg>
  <ref bean="car"/>
</constructor-arg>

<constructor-arg ref="car"/>
集合元素
<map>

  <entry>

    <key><ref bean="keyBean"/></key>

    <ref bean="valueBean"/>

  </entry>

</map>


<map>
  <entry key-ref="keyBean" value-ref="valueBean"/>
</map>

<ref> 的简化形式对应于<ref bean="xxx">,而<ref local="xxx">和<ref parent="xxx"> 则没有对应的简化形式。

3.使用 p 命名空间

为了简化 XML 文件的配置,越来越多的 XML文件采用属性而非子元素配置信息。Spring 从2.5版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。使用 p 命名空间后,基于 XML 的配置方式将进一步简化。

使用 p 命名空间前

<?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-4.0.xsd">

  <bean id="car" class="com.smart.ditype.Car">
    <property name="brand" value="红旗&amp;CA72"/>
    <property name="maxSpeed" value="200"/>
    <property name="price" value="20000.00"/>
  </bean>
  <bean id="boss" class="com.smart.ditype.Boss">
    <property name="car" ref="car"/>
  </bean>
</beans>

使用 p 命名空间后

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
    <bean id="car" class="com.smart.ditype.Car"
    p:brand="红旗&amp;CA72"
    p:maxSpeed="200"
    p:price="20000.00"/>
  <bean id="boss" class="com.smart.ditype.Boss"
    p:car-ref="car"/>
</beans>

未采用 p 命名空间前,<bean> 使用 <property> 子元素配置Bean的属性:采用 p 命名空间后,采用 <bean> 的元素属性配置 Bean 的属性。

对于字面值属性,其格式为:p:<属性名>="xxxx"

对于引用对象的属性,其格式为:p:<属性名>-ref="xxxx"

正是由于 p 命名空间中的属性名是可变的,所以 p 命名空间没有对应的 Schema 定义文件,也就无须在 xsi:schemaLocation 中为 p 命名空间指定 Schema 定义文件。

自动装配

Spring Ioc 容器知道所有 Bean 的配置信息,此外,通过 Java 反射机制还可以获知实现类的结构信息,如构造函数方法的结构、属性等信息。掌握所有 Bean 的这些信息后,Spring Ioc 容器就可以按照某种规则对容器中的 Bean 进行自动装配,而无须通过显式的方式进行依赖配置。Spring 为厌恶配置的开发人员提供了一种轻松的方法,可以按照某些规则进行 Bean 的自动装配。

<bean> 元素提供了一个指定自动装配类型的属性:autowire="<自动装配类型>"。Spring 提供了4种自动装配类型,用户可以根据具体情况进行选择,如下表所示。

自动装配类型 说明
byName
根据名称进行自动匹配。假设Boss有一个名为car的属性,如果容器中刚好有一个名为car的Bean,
Spring就会自动将其装配给Boss的car属性

byType
根据类型进行自动匹配。假设Boss有一个car类型的属性,如果容器中刚好有一个Car类型的
Bean,Spring就会自动将其装配给Boss的这个属性

constructor
与ByType类似,只不过它是针对构造函数注入而言的。如果Boss有一个构造函数,构造函数包
含一个Car类型的入参,如果容器中有一个Car类型的Bean,则Spring将自动把这个Bean作为Boss
构造函数的入参;如果容器中没有找到和构造函数入参匹配类型的Bean,则Spring将抛出异常

autodetect
根据Bean的自省机制决定采用byType还是constructor进行自动装配。如果Bean提供了默认的构
造函数,则采用byType:否则采用constructor

<beans> 元素标签中的 default-autowire 属性可以配置全局自动匹配,default-autowire 属性的默认值为 no,表示不启用自动装配;其他几个可选配置值分别为 byName、byType、constructor 和 autodetect,这几个配置值的含义是不言自明的。不过在 <beans> 中定义的自动装配策略可以被 <bean> 的自动装配策略覆盖。

自动装配以四两拨千斤的方式完成容器中 Bean 之间的装配工作,这种省心省力的自动装配机制确实省却了大量配置工作。在实际开发中,XML 配置方式很少启用自动装配功能,而基于注解的配置方式默认采用 byType 自动装配策略。

原文地址:https://www.cnblogs.com/jwen1994/p/11037496.html

时间: 2024-07-30 05:36:37

Spring 简化装配Bean的配置方式的相关文章

spring 自动装配 bean 有哪些方式?

Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 隐式的bean发现机制和自动装配 在java代码或者XML中进行显示配置 参考链接:spring Bean装配的几种方式简单介绍 原文地址:https://www.cnblogs.com/jxxblogs/p/12147464.html

spring(2)装配Bean

[0]README 0)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review  spring(2)装配Bean 的相关知识: 1)在spring中,对象无需自己查找或创建与其所关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象: 2)装配:创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质(干货--装配是依赖注入的本质): 3)可以预热一下:在Spring中装配bean有多种方式:配置Spring容器最常见的三

Spring 自动装配 Bean

Spring3系列8- Spring 自动装配 Bean 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiring ‘byType 4.      Auto-Wiring ‘constructor’ 5.      Auto-Wiring ‘autodetect’ Spring Auto-Wiring Beans——Spring自动装配Bean 所谓自动装配,就是将一个Bean注入到其他Bean的Prope

Spring基础系列8 -- Spring自动装配bean

Spring基础系列8 -- Spring自动装配bean 转载:http://www.cnblogs.com/leiOOlei/p/3548290.html 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiring ‘byType 4.      Auto-Wiring ‘constructor’ 5.      Auto-Wiring ‘autodetect’ Spring Auto-Wiring Be

Spring自动装配Bean详解

1.      Auto-Wiring 'no' 2.      Auto-Wiring 'byName' 3.      Auto-Wiring 'byType 4.      Auto-Wiring 'constructor' 5.      Auto-Wiring 'autodetect' Spring Auto-Wiring Beans--Spring自动装配Bean 所谓自动装配,就是将一个Bean注入到其他Bean的Property中,类似于以下: <bean id="cust

Spring自动装配Bean的五种方式

在Spring中,支持 5 自动装配模式. no – 缺省情况下,自动配置是通过"ref"属性手动设定,在项目中最常用byName – 根据属性名称自动装配.如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它.byType – 按数据类型自动装配.如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它.constructor – 在构造函数参数的byType方式.autodetect – 如果找到默认的构造函数,使用"自动装配用构造&qu

Spring框架装配Bean的三种方式

欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝的角度去观察(了解)Java体系.使Java的各种后端技术在你心中模块化:让你在工作中能将Java各个技术了然于心:能够即插即用.本章我们来一起了解Spring专栏-SpringBean装配. 本章我们一起来探讨SpringBean的装配,所谓 "装配" 就是值将Bean安装Bean容器中

[spring]03_装配Bean

JavaBean JavaBean 是什么 JavaBean 是一种JAVA语言写成的可重用组件. 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器. JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性. 例 以下是一个简单的JavaBean类. 定义一个Person类,有 name 和 age 两个属性,以及这两个属性的 get.set 方法. package com.demo.web.controllers; public class Perso

spring实战装配bean之Bean的作用域以及初始化和销毁Bean

1.Bean的作用域 所有的spring bean默认都是单例.当容器分配一个Bean时,不论是通过装配还是调用容器的getBean()方法,它总是返回Bean的同一个实例.有时候需要每次请求时都获得唯一的Bean实例,那么就需要覆盖Spring默认的单例配置.当在Spring中配置<bean>元素时,可以为bean声明一个作用域.为了让spring在每次请求时都为bean产生一个新的实例,只需要配置bean的scope属性为prototype即可.如下所示: <bean id=&quo