[java] view plaincopyprint?


Java实例的属性值可以有很多种数据类型、基本类型值、字符串类型、java实例甚至其他的Bean实例、java集合、数组等。所以Spring允许通过如下几个元素为Bean实例的属性指定值:

value

ref

bean

list、set、map、props

一、value:设置普通属性值

<value.../>元素用于指定字符串类型、基本类型的属性值。Spring使用XML解析器来解析出这些数据,然后利用java.beans.PropertyEdior完成类型转换:从java.lang.String类型转换为所需的参数值类型。如果目标类型是基本数据类型,通常都是可以正确转换。

  1. public class ValueTest {
  2. //定义一个String型属性
  3. private String name;
  4. //定义一个int型属性
  5. private int age;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public int getAge() {
  13. return age;
  14. }
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. }
public class ValueTest {
//定义一个String型属性
private String name;
//定义一个int型属性
private int age; 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;
}
}

上面实例只是演示了注入普通属性值。在Spring配置文件中使用<value.../>元素来为这两个属性指定属性值。

  1. <span style="WHITE-SPACE: pre"> </span><bean id="text" class="com.spring.service.impl.ValueTest">
  2. <property name="age" value="1" />
  3. <property name="name" value="chenssy" />
  4. </bean>
<bean id="text" class="com.spring.service.impl.ValueTest">
<property name="age" value="1" />
<property name="name" value="chenssy" />
</bean>

通过上面可以知道<value.../>元素主要用于传入字符串、基本类型的属性值。

二、ref:配置合作者

<value.../>主要是配置基本类型的属性值,但是如果我们需要为Bean设置属性值是另一个Bean实例时,这个时候需要使用<ref.../>元素。使用<ref.../>元素可以指定如下两个属性。

bean:引用不在同一份XML配置文件中的其他Bean实例的id属性值。

local:引用同一份XML配置文件中的其他Bean实例的id属性值。

  1. <span style="WHITE-SPACE: pre"> </span><bean id="steelAxe" class="com.spring.service.impl.SteelAce"></bean>
  2. <bean id="chinese" class="com.spring.service.impl.Chinese" >
  3. <property name="axe">
  4. <ref local="steelAxe"/>
  5. </property>
  6. </bean>
<bean id="steelAxe" class="com.spring.service.impl.SteelAce"></bean>
<bean id="chinese" class="com.spring.service.impl.Chinese" >
<property name="axe">
<ref local="steelAxe"/>
</property>
</bean>

其实Spring提供了一种更加简洁的写法:

  1. <bean id="steelAxe" class="com.spring.service.impl.SteelAce"></bean>
  2. <bean id="chinese" class="com.spring.service.impl.Chinese" >
  3. <property name="axe" ref="steelAxe" />
  4. </bean>
	<bean id="steelAxe" class="com.spring.service.impl.SteelAce"></bean>
<bean id="chinese" class="com.spring.service.impl.Chinese" >
<property name="axe" ref="steelAxe" />
</bean>

通过property增加ref属性,一样可以将另一个Bean的引用设置成axe属性值。这样写的效果和使用<ref.../>属性一样,而且不需要区分是使用bean属性还是local属性,所以推荐这种写法。

2.1、使用自动装配注入合作者bean

Spring支持自动装配Bean与Bean之间的依赖关系,也就是说我们无需显示的指定依赖Bean。由BeanFactory检查XML配置文件内容,根据某种规则,为主调Bean注入依赖关系。

Spring的自动装配机制可以通过<bean.../>元素的default-autowire属性指定,也可以通过<bean.../>元素的autowire属性指定。

自动装配可以减少配置文件的工作量,但是它降低了依赖关系的透明性和清晰性,所以一般来说在较大部署环境中不推荐使用,显示配置合作者能够得到更加清晰的依赖关系。Spring提供了如下几种规则来实现自动装配。

no:不适用自动装配。Bean依赖必须通过ref元素定义。

byName:根据属性名自动装配。BeanFactory查找容器中的全部Bean,找出其中id属性与属性同名的Bean来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入。

byType:根据属性类型自动装配。BeanFactory查找容器中的全部Bean,如果正好有一个与依赖属性类型相同的Bean,就自动注入这个属性;但是如果有多个这样的Bean,就会抛出一个异常。如果没有匹配的Bean,则什么都不会发生,属性就不会被设置。如果需要无法自动装配时抛出异常,则设置dependency-check=”objects”。

constructor:与不Type类似,区别是用于构造注入的参数。

Autodetect:BeanFactory根据Bean内部结构,决定使用constructor或者byType。如果找到一个默认的构造函数,则使用byTe。

byName规则

byTyep规则是指通过名字注入依赖关系,假如Bean A的实现类里面包含setB()方法,而Spring的配置文件恰好包含一个id为b的Bean,则Spring容器就会将b实例注入Bean A中。如果容器中没有名字匹配的Bean,Spring则不会做任何事情。

  1. <bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byName" />
  2. <bean id="gundog" class="com.spring.service.impl.Gundog">
  3. <property name="name" value="wangwang" />
  4. </bean>
	<bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byName" />
<bean id="gundog" class="com.spring.service.impl.Gundog">
<property name="name" value="wangwang" />
</bean>

上面的配置文件指定了byName规则。则com.app.service.impl.Chinese类中提供如下的依赖注入方法:

  1. <span style="WHITE-SPACE: pre"> </span>/*
  2. * 依赖关系必须的setter方法,因为需要通过名字自动装配
  3. * 所以setter方法必须提供set+Bean名,Bean名的首字母大写
  4. * @param dog 设置的dog值
  5. */
  6. public void setGundog(Dog dog){
  7. this.dog = dog;
  8. }
/*
* 依赖关系必须的setter方法,因为需要通过名字自动装配
* 所以setter方法必须提供set+Bean名,Bean名的首字母大写
* @param dog 设置的dog值
*/
public void setGundog(Dog dog){
this.dog = dog;
}

byType规则

byType规则是根据类型匹配注入依赖关系。假如A实例有setB(B b)方法,而Spring配置文件中恰好有一个类型B的Bean实例,容器为A注入类型匹配的Bean实例。如果容器中存在多个B的实例,则会抛出异常,如果没有B实例,则不会发生任何事情。

  1. <bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byType" />
  2. <bean id="gundog" class="com.spring.service.impl.Gundog">
  3. <property name="name" value="wangwang" />
  4. </bean>
	<bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byType" />
<bean id="gundog" class="com.spring.service.impl.Gundog">
<property name="name" value="wangwang" />
</bean>

针对上面的配置文件Chinese类有如下方法。

  1. <span style="WHITE-SPACE: pre"> </span>/**
  2. * 依赖关系必须的setter方法
  3. * 因为使用按类型自动装配,setter方法的参数类型与容器的Bean的类型相同
  4. * 程序中的Gundog实现了Dog接口
  5. * @param dog传入的dog对象
  6. */
  7. public void setDog(Dog dog){
  8. this.dog = dog;
  9. }
/**
* 依赖关系必须的setter方法
* 因为使用按类型自动装配,setter方法的参数类型与容器的Bean的类型相同
* 程序中的Gundog实现了Dog接口
* @param dog传入的dog对象
*/
public void setDog(Dog dog){
this.dog = dog;
}

当一个Bean即使用自动装配依赖,又使用ref显示依赖时,则显示指定的依赖就会覆盖自动装配。

在默认的情况下,Spring会自动搜索容器中的全部Bean,并对这些Bean进行判断,判断他们是否满足自动装配的条件,如果满足就会将该Bean注入目标Bean实例中。如果我们不想让Spring搜索容器中的全部Bean,也就是说,我们需要Spring来判断哪些Bean需要搜索,哪些Bean不需要搜索,这个时候就需要用到autowire-candidate属性。通过为<bean.../>元素设置autowire-candidate=”false”,即可将该Bean限制在自动装配范围之外,容器在查找自动装配对象时将不考虑该Bean。

三、Bean:注入嵌套Bean

如果某个Bean所依赖的Bean不想被Spring容器直接访问,则可以使用嵌套Bean。<bean.../>元素用来定义嵌套Bean,嵌套Bean只对嵌套它的外部Bean有效,Spring容器无法直接访问嵌套Bean,因此在定义嵌套Bean时是无需指定id属性的。

  1. <bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byName">
  2. <property name="axe">
  3. <!--
  4. 属性值为嵌套Bean,嵌套Bean不能由Spring容器直接访问,
  5. 所以嵌套Bean是不需要id属性
  6. -->
  7. <bean class="com.spring.service.impl.SteelAce" />
  8. </property>
  9. </bean>
	<bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byName">
<property name="axe">
<!--
属性值为嵌套Bean,嵌套Bean不能由Spring容器直接访问,
所以嵌套Bean是不需要id属性
-->
<bean class="com.spring.service.impl.SteelAce" />
</property>
</bean>

采用上面的配置可以保证嵌套Bean不能被容器访问,因此不用担心其他程序修改嵌套bean。但是嵌套Bean限制了Bean的访问,提高了程序的内聚性。

四、list、set、map、props

<value.../>元素是注入基本数据类型和String类型的,但是如果某个Bean的属性是集合呢?这个时候我们就需要使用集合元素,<list.../>、<set.../>、<map.../>和<props.../>元素分别用来设置类型list、set、map和Properties的集合属性值。

先看下面java类:

  1. public class Chinese implements Person{
  2. //下面是一系列的集合属性
  3. private List<String> schools;
  4. private Map scores;
  5. private Map<String, Axe> phaseAxes;
  6. private Properties health;
  7. private Set axe;
  8. private String[] books;
  9. public List<String> getSchools() {
  10. return schools;
  11. }
  12. public void setSchools(List<String> schools) {
  13. this.schools = schools;
  14. }
  15. public Map getScores() {
  16. return scores;
  17. }
  18. public void setScores(Map scores) {
  19. this.scores = scores;
  20. }
  21. public Map<String, String> getPhaseAxes() {
  22. return phaseAxes;
  23. }
  24. public void setPhaseAxes(Map<String, String> phaseAxes) {
  25. this.phaseAxes = phaseAxes;
  26. }
  27. public Properties getHealth() {
  28. return health;
  29. }
  30. public void setHealth(Properties health) {
  31. this.health = health;
  32. }
  33. public Set getAxe() {
  34. return axe;
  35. }
  36. public void setAxe(Set axe) {
  37. this.axe = axe;
  38. }
  39. public String[] getBooks() {
  40. return books;
  41. }
  42. public void setBooks(String[] books) {
  43. this.books = books;
  44. }
  45. public void useAxe() {
  46. }
  47. }
public class Chinese implements Person{

	//下面是一系列的集合属性
private List<String> schools;
private Map scores;
private Map<String, Axe> phaseAxes;
private Properties health;
private Set axe;
private String[] books; public List<String> getSchools() {
return schools;
} public void setSchools(List<String> schools) {
this.schools = schools;
} public Map getScores() {
return scores;
} public void setScores(Map scores) {
this.scores = scores;
} public Map<String, String> getPhaseAxes() {
return phaseAxes;
} public void setPhaseAxes(Map<String, String> phaseAxes) {
this.phaseAxes = phaseAxes;
} public Properties getHealth() {
return health;
} public void setHealth(Properties health) {
this.health = health;
} public Set getAxe() {
return axe;
} public void setAxe(Set axe) {
this.axe = axe;
} public String[] getBooks() {
return books;
} public void setBooks(String[] books) {
this.books = books;
} public void useAxe() { } }

上面的java代码中有数组、list、set、,map、Properties。下面是针对上面的配置文件。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <!-- 定义一个普通的Axe Bean -->
  7. <bean id="steelAxe" class="com.spring.service.impl.SteelAxe" />
  8. <bean id="stoneAxe" class="com.spring.service.impl.StoneAxe" />
  9. <!--定义Chinese Bean -->
  10. <bean id="chinese" class="com.spring.service.impl.Chinese">
  11. <property name="schools">
  12. <list>
  13. <value>小学</value>
  14. <value>中学</value>
  15. <value>大学</value>
  16. </list>
  17. </property>
  18. <property name="scores">
  19. <map>
  20. <entry key="语文" value="88" />
  21. <entry key="数学" value="87" />
  22. <entry key="外语" value="88" />
  23. </map>
  24. </property>
  25. <property name="phaseAxes">
  26. <map>
  27. <entry key="原始社会" value-ref="stoneAxe" />
  28. <entry key="农业社会" value-ref="steelAxe" />
  29. </map>
  30. </property>
  31. <property name="health">
  32. <props>
  33. <prop key="血压">正常</prop>
  34. <prop key="身高">175</prop>
  35. </props>
  36. </property>
  37. <property name="axe">
  38. <set>
  39. <value>普通字符串</value>
  40. <bean class="com.spring.service.impl.SteelAxe"></bean>
  41. <ref local="stoneAxe"/>
  42. </set>
  43. </property>
  44. <property name="books">
  45. <list>
  46. <value>java 编程思想</value>
  47. <value>思考致富</value>
  48. <value>将才</value>
  49. </list>
  50. </property>
  51. </bean>
  52. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 定义一个普通的Axe Bean -->
<bean id="steelAxe" class="com.spring.service.impl.SteelAxe" />
<bean id="stoneAxe" class="com.spring.service.impl.StoneAxe" /> <!--定义Chinese Bean -->
<bean id="chinese" class="com.spring.service.impl.Chinese">
<property name="schools">
<list>
<value>小学</value>
<value>中学</value>
<value>大学</value>
</list>
</property> <property name="scores">
<map>
<entry key="语文" value="88" />
<entry key="数学" value="87" />
<entry key="外语" value="88" />
</map>
</property> <property name="phaseAxes">
<map>
<entry key="原始社会" value-ref="stoneAxe" />
<entry key="农业社会" value-ref="steelAxe" />
</map>
</property> <property name="health">
<props>
<prop key="血压">正常</prop>
<prop key="身高">175</prop>
</props>
</property> <property name="axe">
<set>
<value>普通字符串</value>
<bean class="com.spring.service.impl.SteelAxe"></bean>
<ref local="stoneAxe"/>
</set>
</property> <property name="books">
<list>
<value>java 编程思想</value>
<value>思考致富</value>
<value>将才</value>
</list>
</property>
</bean>
</beans>

从上面的配置文件中可以看出,Spring对list属性和数组属性的处理是一样的。

当我们使用<list.../>、<set.../>、<map.../>等元素配置集合属性时,我们还需要手动配置集合元素。由于集合元素又可以是基本类型值、引用容器中的其他Bean、嵌套Bean和集合属性等。所以这些元素又可以接受如下子元素:

value:指定集合元素是基本数据类型或者字符类型值。

ref:指定集合元素师容器中另一个Bean实例。

bean:指定集合元素是一个嵌套Bean。

list、set、map、props:指定集合元素值又是集合。

读李刚《轻量级Java EE企业应用实战》

Spring读书笔记-----Spring的Bean之设置Bean值的更多相关文章

  1. (转) Spring读书笔记-----Spring的Bean之配置依赖

    前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念),现在介绍Spring Bean的基本配置. 从开始我们知道Jav ...

  2. Spring读书笔记-----Spring的Bean之Bean的基本概念

    从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...

  3. (转)Spring读书笔记-----Spring的Bean之Bean的基本概念

    从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...

  4. (转)Spring读书笔记-----Spring核心机制:依赖注入

    Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...

  5. Spring读书笔记-----Spring核心机制:依赖注入

    spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.今天就和大家一起来学习一下 依赖注入的基本概念 依赖注入(Dependecy Injection),也称为IoC(I ...

  6. Spring读书笔记——bean解析

    前情回顾 上篇<Spring读书笔记--bean加载>我们从代码角度介绍了有哪些类负责解析XML文件,又是如何一步步从XML格式脱变成我们熟悉的bean的,直到DefaultBeanDef ...

  7. Spring读书笔记——bean创建(上)

    通过<Spring读书笔记--bean加载>和<Spring读书笔记--bean解析>,我们明白了两件事. Spring如何加载消化一个xml配置文件 Spring如何将xml ...

  8. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  9. 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)

    很长一段时间关注在Java Web开发的方向上,提及到Jave Web开发就绕不开Spring全家桶系列,使用面向百度,谷歌的编程方法能够完成大部分的工作.但是这种不系统的了解总觉得自己的知识有所欠缺 ...

随机推荐

  1. iframe的安全问题

    今天尝试在iframe中嵌入外部网站, 碰到了一些小问题. 如何让自己的网站不被其他网站的iframe引用? 我测试的时候发现我把iframe的src指定到github不起作用. 原来是它把X-Fra ...

  2. [转]CharacterController与Rigidbody

    From: http://blog.csdn.net/czlilove/article/details/9139103 今天下午碰到个问题纠结了很久:人物加上了Rigidbody并使用了重力,遇到悬崖 ...

  3. Colour your Log4Net events in your RichTextBox zz

    You’re most probably here because you have already read my article How to watch your log through you ...

  4. MVC批量导出数据方法

    近段时间做了个数据平台,其中涉及到批量导出CSV格式数据的业务,主要使用了部分视图和视图之间传值等知识点,今天做了下整理,特此分享下: 主要分为四步: 1:要打印的数据格式陈列View: 2:自定义导 ...

  5. dfs 生成排列和组合

    利用深度优先搜索的性质可以方便的生成n的排列和组合,但是生成组合时每个组合里面元素的个数必须事先确定,以前以为生成组合跟排列一样到n时就可以回溯,直到今天做了某题之后才发现那是错的,那样做生成不了所有 ...

  6. octopress Endless Error With Gem Dependencies

    因为重装系统的缘故,需要重新搭建octopress环境,在执行到: bundle install 会出现一些这样的错误:An error occurred while installing timer ...

  7. Java 并发包中的读写锁及其实现分析

    1. 前言 在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时 刻可以允许多个读线程访问,但是在写线程访问时,所有 ...

  8. hadoop的安装

    1. 获取linux操作系统 可以申请云主机. 2. 安装JDK,配置环境变量 sudo apt-get install openjdk-7-jdk vim /etc/profile 在配置文件中配置 ...

  9. Area - POJ 1265(pick定理求格点数+求多边形面积)

    题目大意:以原点为起点然后每次增加一个x,y的值,求出来最后在多边形边上的点有多少个,内部的点有多少个,多边形的面积是多少. 分析: 1.以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其 ...

  10. 使用C++的开源序列化(Serialization)库cereal

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用C++的开源序列化(Serialization)库cereal.