龙空技术网

Spring学习笔记之Bean的属性注入

JeffreyHu 58

前言:

而今兄弟们对“xml属性值包含特殊字符”大约比较珍视,小伙伴们都想要剖析一些“xml属性值包含特殊字符”的相关资讯。那么小编在网摘上汇集了一些对于“xml属性值包含特殊字符””的相关知识,希望各位老铁们能喜欢,同学们快快来学习一下吧!

本文为自建博客同步发表,为了您更好的阅读体验,可点击文章下方“了解更多”链接前往我的博客。

通常,JavaBean的属性值是私有的,同时拥有一组存取器方法,以setXxx()和getXxx()的形式存在。Spring通过Java 的反射机制借助属性的set方法来配置属性的值,以实现setter方式的注入。

下面定义一个Person类来演示Spring Bean的属性注入:

package cn.javacodes.spring.beans;/** * Created by Jeffrey on 16-8-31. */public class Person {    private String name;    private int age;    private String sex;    private String resume;    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 String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public String getResume() {        return resume;    }    public void setResume(String resume) {        this.resume = resume;    }    public Car getCar() {        return car;    }    public void setCar(Car car) {        this.car = car;    }    public Person(String name, int age, String sex, String resume) {        this.name = name;        this.age = age;        this.sex = sex;        this.resume = resume;    }    public Person(String name, int age, String sex, String resume, Car car) {        this.name = name;        this.age = age;        this.sex = sex;        this.resume = resume;        this.car = car;    }    public Person() {    }}

Person类中包含一个无参的构造方法,因此可以在Spring中使用下面的XML声明一个:

<bean id="person" class="cn.javacodes.spring.beans.Person"></bean>

通过上面的XML生命的没有对任何属性进行赋值,下面逐步讲解如何为属性进行赋值。

一、注入简单值(字面值)1、通过value属性注入

在Spring中可以使用元素配置Bean的属性。例如现在想给bean person的姓名、年龄、性别、简历等属性赋值,那么可以使用下面的方式:

    <bean id="person" class="cn.javacodes.spring.beans.Person">        <property name="name" value="张三"></property>        <property name="age" value="16"></property>        <property name="sex" value="男"></property>        <property name="resume" value="疯狂的Java码农"></property>    </bean>

一旦Person被实例化,Spring就会调用元素所指定属性的setter方法为该属性注入值。在本实例中,name、sex、resume属性均为String类型的字符串,而我们发现int类型的age属性也可以成功注入简单值,这是因为元素并没有限制只能注入String类型的值,value属性同样可以指定为基本数据类型(包括数值型和布尔型等)。

2、通过子元素注入

那么我们想象一下,如果我们想注入的值中包含XML的特殊字符怎么办,上述方法是否仍然奏效?不妨尝试一下,例如我想将person的resume属性注入值“”,那么在这个值中,“<>”在XML中拥有特殊的含义,如果仍然使用value属性进行赋值,将会出现异常!

Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 11 in XML document from class path resource [applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 11; columnNumber: 40; 与元素类型 "property" 相关联的 "value" 属性值不能包含 '<' 字符。

那么如何解决这个问题呢?元素中可以添加一个子元素,其作用与value属性基本相同,而当我们想要注入包含特殊字符的字面值时,可以在子元素中使用CDATA节来解决,例如:

    <bean id="person" class="cn.javacodes.spring.beans.Person">        <property name="name" value="张三"></property>        <property name="age" value="16"></property>        <property name="sex" value="男"></property>        <property name="resume">            <value><![CDATA[<Coder!>]]></value>        </property>    </bean>
二、引用其他Bean

上面使用value属性或子元素注入简单值只是实现简单的硬编码,而在实际开发过程中,经常需要为某一个属性赋值为一个对象,通常为另一个bean。那么如何在Spring中为属性引用其他bean呢?

例如本例中Person实例拥有一个Car类型的属性car,可以使用元素的ref属性为其进行赋值。类Car的源码如下:

package cn.javacodes.spring.beans;/** * Created by Jeffrey on 2016-09-06. */public class Car {    private String brand;    private String model;    private String color;    public Car() {    }    public Car(String brand, String model, String color) {        this.brand = brand;        this.model = model;        this.color = color;    }    public String getBrand() {        return brand;    }    public void setBrand(String brand) {        this.brand = brand;    }    public String getModel() {        return model;    }    public void setModel(String model) {        this.model = model;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    @Override    public String toString() {        return "Car{" +                "brand='" + brand + ''' +                ", model='" + model + ''' +                ", color='" + color + ''' +                '}';    }}

我们首先在XML中声明一个Car类型的,源码如下:

    <bean id="car" class="cn.javacodes.spring.beans.Car">        <property name="brand" value="奥迪"></property>        <property name="model" value="A6"></property>        <property name="color" value="黑色"></property>    </bean>

那么可以在person bean中引用这个bean,源码如下:

    <bean id="person" class="cn.javacodes.spring.beans.Person">        <property name="name" value="张三"></property>        <property name="age" value="16"></property>        <property name="sex" value="男"></property>        <property name="resume">            <value><![CDATA[<Coder!>]]></value>        </property>        <property name="car" ref="car"></property>    </bean>
三、注入内部Bean

我们知道,在Spring中bean的默认作用域是单例的,通过上述方式注入bean,意味着这个bean还可能被其他bean引用。例如,可能有另外一个Person类型的bean person1,其car属性同样引用的是id为car的bean,那么意味着这两个人同时拥有同一台奥迪A6,这通常是不现实的。那么如何为一个Bean创建一个独有的内部bean呢?

在Spring中元素中还可以嵌套其它的元素,我们称嵌套在内部的为内部bean,这个概念与Java的内部类十分相似。

我们修改一下person的声明,代码如下:

    <bean id="person" class="cn.javacodes.spring.beans.Person">        <property name="name" value="张三"></property>        <property name="age" value="16"></property>        <property name="sex" value="男"></property>        <property name="resume">            <value><![CDATA[<Coder!>]]></value>        </property>        <property name="car">            <bean class="cn.javacodes.spring.beans.Car">                <property name="brand" value="奥迪"></property>                <property name="model" value="A6"></property>                <property name="color" value="黑色"></property>            </bean>        </property>    </bean>

这样我们就成功的注入了一个内部Bean。细心的朋友可能会发现,在这里内部bean没有给定其id属性,因为在这里其id属性似乎并不是那么必要,因为我们永远不会通过id来引用内部bean。这也突出了内部Bean的最大缺点:它们不能被复用。内部Bean仅适用于一次注入,而且也不能被其它Bean所引用。

内部Bean并不局限于在元素中使用,我们同样可以在中使用,例如我们修改person的声明如下:

    <bean id="person" class="cn.javacodes.spring.beans.Person">        <constructor-arg value="张三"></constructor-arg>        <constructor-arg value="16"></constructor-arg>        <constructor-arg name="sex" value="男"></constructor-arg>        <constructor-arg >            <value><![CDATA[<Coder!>]]></value>        </constructor-arg>        <constructor-arg>            <bean class="cn.javacodes.spring.beans.Car">                <constructor-arg name="brand" value="奥迪"></constructor-arg>                <constructor-arg name="model" value="A6"></constructor-arg>                <constructor-arg name="color" value="黑色"></constructor-arg>            </bean>        </constructor-arg>    </bean>

自建博客地址:,欢迎访问! 本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客

本文作者: Jeffrey

本文链接:

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

标签: #xml属性值包含特殊字符