1,字面值

•字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。

•基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式

•若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。

先把代码贴上:

package com.yfy;

public class Car {
private String brand;
private String crop;
private double price;
private int maxSpeed;
public Car(String brand, String crop, double price) {
super();
this.brand = brand;
this.crop = crop;
this.price = price;
} public Car(String brand, String crop, int maxSpeed) {
super();
this.brand = brand;
this.crop = crop;
this.maxSpeed = maxSpeed;
} @Override
public String toString() {
return "Car [brand=" + brand + ", crop=" + crop + ", price=" + price + ", maxSpeed=" + maxSpeed + "]";
} }
package com.yfy;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// HelloWorld helloWorld =(HelloWorld) applicationContext.getBean("helloWorld");
// helloWorld.hello();
Car car = (Car) applicationContext.getBean("car1");
System.out.println(car);
car = (Car) applicationContext.getBean("car2");
System.out.println(car);
} }
<?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.xsd">
<!--
配置bean
class: bean 的 指的是HelloWorld的全路径名称,并且由于是通过反射方式创建Bean,因此Bean中必须有无参的构造器
id:当创建好一个bean之后,如何引用这个bean呢?就需要使用id.
-->
<bean id="helloWorld" class="com.yfy.HelloWorld">
<property name="name" value="spring"></property>
</bean>
<!-- 通过构造方法来配置bean -->
<bean id="car1" class="com.yfy.Car">
<constructor-arg value="audi" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
<constructor-arg value="40000" index="2"></constructor-arg>
</bean>
<bean id="car2" class="com.yfy.Car">
<constructor-arg value="baoma" type="java.lang.String"></constructor-arg>
<constructor-arg value="shanghai" type="java.lang.String"></constructor-arg>
<constructor-arg value="400" type="int"></constructor-arg>
</bean> </beans>

运行结果:

Car [brand=audi, crop=shanghai, price=40000.0, maxSpeed=0]
Car [brand=baoma, crop=shanghai, price=0.0, maxSpeed=400]

上面一切正常,但是有些地方的细节可以深入讨论。

比如配置文件中的:

<bean id="car2" class="com.yfy.Car">
<constructor-arg value="baoma" type="java.lang.String"></constructor-arg>
<constructor-arg value="shanghai" type="java.lang.String"></constructor-arg>
<constructor-arg value="400" type="int"></constructor-arg>
</bean>

<constructor-arg value="400" type="int"></constructor-arg>

(1)这一行可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。

<bean id="car2" class="com.yfy.Car">
<constructor-arg value="baoma" type="java.lang.String"></constructor-arg>
<constructor-arg value="shanghai" type="java.lang.String"></constructor-arg>
<constructor-arg type="int">
<value>250</value>
</constructor-arg>

</bean>

(2)若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。

<constructor-arg value="<shanghai>" type="java.lang.String"></constructor-arg>

比如这里的"<shanghai>" 字符串的值为<shanghai>,在xml中肯定是有问题的,会出现如下错误,必须使用CDATA来包裹。

与元素类型 "constructor-arg" 相关联的 "value" 属性值不能包含 '<' 字符。

下面使用CDATA就可以解决这个问题。

<constructor-arg type="java.lang.String">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>

2,引用其他的bean

•组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用

•(1)在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.

•(2)也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean

再编写一个Person类:

package com.yfy;

public class Person {
private String name;
private int age;
private Car car; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
} }

再配置一下bean

<!-- 通过构造方法来配置bean -->
<bean id="car1" class="com.yfy.Car">
<constructor-arg value="audi" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
<constructor-arg value="40000" index="2"></constructor-arg>
</bean>
    <bean id="car2" class="com.yfy.Car">
<constructor-arg value="baoma" type="java.lang.String"></constructor-arg>
<constructor-arg type="java.lang.String">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg type="int">
<value>250</value>
</constructor-arg>
</bean>
    <bean id="person" class="com.yfy.Person">
<property name="name" value="tom"></property>
<property name="age" value="45"></property>
<property name="car" ref="car2"></property>
</bean>

主函数:

结果:

上面是在 Bean 的配置文件中, 可以通过 <ref> 元素(下图注视部分)或 ref 属性(上面使用的)为 Bean 的属性或构造器参数指定对 Bean 的引用.

---------------------------------------------------------------------------------------------------------------------------------

下面看看:在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean。

•当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean. 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里, 不需要设置任何 id 或 name 属性

•内部 Bean 不能使用在任何其他地方

上面的例子中的bean: car1.car2.person为平行关系,person的bean引入car2,这是bean person引入外部bean.

下面来看:此处需要引用的bean直接自身就定义一个。

<bean id="person" class="com.yfy.Person">
<property name="name" value="tom"></property>
<property name="age" value="45"></property>
<property name="car" >
<bean class="com.yfy.Car">
<constructor-arg value="dazhong" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
<constructor-arg value="50000" index="2"></constructor-arg>
</bean>
</property>
</bean>

对于属性注入没问题,那么使用构造器呢?

下面需要对Person类添加一个无参构造函数和有参构造函数。

然后对配置文件进行修改。

<bean id="person1" class="com.yfy.Person">
<constructor-arg value="Jim"></constructor-arg>
<constructor-arg value="55"></constructor-arg>
<constructor-arg name="car">
<bean class="com.yfy.Car">
<constructor-arg value="laosilaisi" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
<constructor-arg value="5440000" index="2"></constructor-arg>
</bean>
</constructor-arg>
</bean>

其实对于外部bean,也可以使用构造器。

<bean id="person1" class="com.yfy.Person">
<constructor-arg value="Jim"></constructor-arg>
<constructor-arg value="55"></constructor-arg>
<constructor-arg ref="car1"></constructor-arg>
</bean>

3,null 值和级联属性

•可以使用专用的 <null/> 元素标签为 Bean 的字符串或其它对象类型的属性注入 null 值

•和 Struts、Hiberante 等框架一样,Spring 支持级联属性的配置。

<bean id="person" class="com.yfy.Person">
<property name="name" value="tom"></property>
<property name="age" value="45"></property>
<property name="car" >
<bean class="com.yfy.Car">
<constructor-arg value="dazhong" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
<constructor-arg value="50000" index="2"></constructor-arg>
</bean>
</property>
<property name="car.maxSpeed" value="222"></property>
</bean>

或者如下配置:

<bean id="person1" class="com.yfy.Person">
<constructor-arg value="Jim"></constructor-arg>
<constructor-arg value="55"></constructor-arg>
<constructor-arg ref="car1"></constructor-arg>
<property name="car.maxSpeed" value="222"></property>
</bean>

注意如果没有为Car设置set方法则会报错。

Bean property 'maxSpeed' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

<property name="car" >
<bean class="com.yfy.Car">
<constructor-arg value="dazhong" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
<constructor-arg value="50000" index="2"></constructor-arg>
</bean>
</property>

上面的配置只为bean初始化3个参数,可以使用<property name="car.maxSpeed" value="222"></property> 对其余的参数进行复制,但是需要注意的是car.maxSpeed中car对象必须存在。属性必须先初始化,才可以为级联属性赋值,不然会出异常。但一般不会为级联属性赋值。

4,集合属性

•在 Spring中可以通过一组内置的 xml 标签(例如: <list>, <set> 或 <map>) 来配置集合属性.

•配置 java.util.List 类型的属性, 需要指定 <list> 标签, 在标签里包含一些元素. 这些标签可以通过 <value> 指定简单的常量值, 通过 <ref> 指定对其他 Bean 的引用. 通过<bean> 指定内置 Bean 定义. 通过 <null/> 指定空元素. 甚至可以内嵌其他集合.

•数组的定义和 List 一样, 都使用 <list>

•配置 java.util.Set 需要使用 <set> 标签, 定义元素的方法与 List 一样.

这里面的需求是某个bean里面的属性包含很多个其他的bean.

下面就代码进行演示:

首先Person类需要改变。

package com.yfy;

import java.util.List;

public class Person {
private String name;
private int age;
private List<Car> cars;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]";
}
}

配置文件改变:

<bean id="person" class="com.yfy.Person">
<property name="name" value="xiaoming"></property>
<property name="age" value="55"></property>
<property name="cars">
<list>
<ref bean="car1"/>
<ref bean="car2"/>
</list>
</property>

</bean>

其实上面的car1和car2是引用外部bean,内部bean照样可以,比如下面的写法。

<bean id="person" class="com.yfy.Person">
<property name="name" value="xiaoming"></property>
<property name="age" value="55"></property>
<property name="cars">
<list>
<ref bean="car1"/>
<ref bean="car2"/>
<bean id="car3" class="com.yfy.Car" >
<constructor-arg value="劳斯莱斯" index="0"></constructor-arg>
<constructor-arg value="美国" index="1"></constructor-arg>
<constructor-arg value="100000000" index="2"></constructor-arg>
</bean>
<bean id="car4" class="com.yfy.Car" >
<property name="brand" value="lanbojini"></property>
<property name="crop" value="meiguo"></property>
<property name="price" value="230123"></property>
<property name="maxSpeed" value="360"></property>
</bean>
</list>
</property>
</bean>

•Java.util.Map 通过 <map> 标签定义, <map> 标签里可以使用多个 <entry> 作为子标签. 每个条目包含一个键和一个值.

•必须在 <key> 标签里定义键

•因为键和值的类型没有限制, 所以可以自由地为它们指定 <value>, <ref>, <bean> 或 <null> 元素.

•可以将 Map 的键和值作为 <entry> 的属性定义: 简单常量使用 key 和 value 来定义; Bean 引用通过 key-ref 和 value-ref 属性定义

•使用 <props> 定义 java.util.Properties, 该标签使用多个 <prop> 作为子标签. 每个 <prop> 标签必须定义 key 属性.

先看Person类代码

package com.yfy;

import java.util.List;
import java.util.Map; public class Person {
private String name;
private int age;
private Map<String, Car> cars; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Map<String, Car> getCars() {
return cars;
}
public void setCars(Map<String, Car> cars) {
this.cars = cars;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]";
}
}

再看如何配置

<bean id="person" class="com.yfy.Person">
<property name="name" value="lihai"></property>
<property name="age" value="25"></property>
<property name="cars">
<map>
<entry key="aa" value-ref="car1"></entry>
<entry key="bb" value-ref="car2"></entry>
</map>
</property>

</bean>

此外对于properties进行操作的xml

从上面的配置中可以看出有个缺点:对于集合的配置,如果多个bean都需要这个集合的配置,那么重复书写是个浪费,那么就需要把集合的配置拿出来,单独配置,其他的bean需要使用直接拿出来即可。

•使用基本的集合标签定义集合时, 不能将集合作为独立的 Bean 定义, 导致其他 Bean 无法引用该集合, 所以无法在不同 Bean 之间共享集合.

•可以使用 util schema 里的集合标签定义独立的集合 Bean. 需要注意的是, 必须在 <beans> 根元素里添加 util schema 定义

具体步骤如下 :

1,在配置文件下面找到util

2,转回到Source下面,进行配置文件编辑,可以看到可选择多种集合

对于上面关于集合的配置,现在可以这样配置了:

    <util:map id="cars">
<entry key="aa" value-ref="car1"></entry>
<entry key="bb" value-ref="car2"></entry>
</util:map> <bean id="person" class="com.yfy.Person">
<property name="name" value="lihai"></property>
<property name="age" value="25"></property>
<property name="cars" ref="cars"></property>
</bean>

最后还有一种使用p命名空间的配置方法。

•为了简化 XML 文件的配置,越来越多的 XML 文件采用属性而非子元素配置信息。

•Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。

•使用 p 命名空间后,基于 XML 的配置方式将进一步简化

Spring 学习笔记 4. 尚硅谷_佟刚_Spring_属性配置细节的更多相关文章

  1. Spring 学习笔记 8. 尚硅谷_佟刚_Spring_使用外部属性文件

    1,配置数据源 (1)添加驱动 (2)编写spring配置文件 <bean id="dataSource" class="org.springframework.j ...

  2. Spring学习笔记 5. 尚硅谷_佟刚_Spring_自动装配

    1,回顾以前的做法 一个人有姓名,有住址,有一辆车.其中住址和车也是一个类,这种情况下不用自动装配是十分容易实现的 (1)Person类 package com.zsq; public class P ...

  3. Spring 学习笔记 3. 尚硅谷_佟刚_Spring_配置 Bean

    1,bean 的配置 <bean id="helloWorld" class="com.yfy.HelloWorld"> <property ...

  4. Spring学习笔记 1. 尚硅谷_佟刚_Spring_HelloWorld

    1,准备工作 (1)安装spring插件 搜索https://spring.io/tools/sts/all就可以下载最新的版本 下载之后不用解压,使用Eclipse进行安装.在菜单栏最右面的Help ...

  5. Spring学习笔记 6. 尚硅谷_佟刚_Spring_Bean 之间的关系

    1,继承关系 首先从简单的代码来看,有一个Address类,配置文件有两个bean (1)Address类 package com.zsq; public class Address { privat ...

  6. Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

    1,理论 •在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. •默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创 ...

  7. Spring 学习笔记 2. 尚硅谷_佟刚_Spring_IOC&DI概述

    1,远古时代 这里讲述的IOC的演变历史,举一个例子,假如需要生成HTML和PDF格式的报表,以前的开发方式就是有个报表服务类需要使用报表生成器 它需要和其他三个都关联,它既需要知道接口类型,也需要知 ...

  8. Java框架spring 学习笔记(八):注入对象类型属性

    使用set方法注入对象属性 编写UserDao.java文件 package com.example.spring; public class UserDao { public void print( ...

  9. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

随机推荐

  1. 调用KEditor批量上传图片

    调用KEditor批量上传图片: <script charset="utf-8" src="/Keditor/kindeditor.js">< ...

  2. nodejs学习笔记(一)

    终于开始学NodeJs了 说说遇到的问题吧 1.安装express npm install -g express(按道理说,这个全局安装是没问题的,但他就是出问题了) 解决方案: 来源:http:// ...

  3. 图解 classpath

    先引用几句网上流传的话: 首先 classpath是指 WEB-INF文件夹下的classes目录 classpath 和 classpath* 区别: classpath:只会到你指定的class路 ...

  4. Hibernate SQL查询 addScalar()或addEntity()

    本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询.          对原 ...

  5. OAuth 2.0 Threat Model and Security Considerations (rfc6819)

    Authorization server The following data elements are stored or accessible on the authorization serve ...

  6. Android 7.0 UICC 分析(一)

    UICC(Universal Intergrated Circuit Card) 框架 * Following is class diagram for uicc classes: * * UiccC ...

  7. opencv单目摄像机标定(二)

    // 引入实际标定板方格宽度的标定程序 #include <string> #include <iostream> #include <cv.h> #include ...

  8. python学习之——操作浏览器

    使用selenium的webdriver框架,对浏览器的常规操作,如下~~ #coding=utf-8 from selenium import webdriver import time from ...

  9. ABAP 动态内表添加单元格颜色字段

    *动态内表alv显示时要求某些单元格显示颜色 *wa_fldcat-datatype不能添加LVC_T_SCOL类型,在创建好内表之后,再添加颜色列. DATA: wa_fldcat TYPE lvc ...

  10. 如何在Mac OS X中显示隐藏的文件

    打开终端,输入: defaults write com.apple.finder AppleShowAllFiles -bool true 显示文件夹中的隐藏文件. defaults write co ...