前言:对于XML文件的配置里面有很多要注意的地方,这里小编详解一下标签中的相关属性配置(因为小编真的是踩了很多坑)这里就想分享经验,让大家别再像小编一样踩同样的坑了
好了,话不多说,直接进入正题了
这里小编主要提到几个属性
- ref
- ![CDATA[]]
- type
为了方便演示,小编在实体类中实现两个实体类相关联
- 创建实体类(Car)
private String brand;
private int price;
private String addr;
public Car() {
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
", addr='" + addr + '\'' +
'}';
}
public Car(String brand, int price, String addr) {
this.brand = brand;
this.price = price;
this.addr = addr;
}
... 省略set() get()方法 (这里小编就不再给出了)
- 创建用户类(User ) 关系:每个用户都拥有自己的车
private String user_name;
private String user_sex;
private int user_age;
private Car car;
public User_Caffr() {
}
public User_Caffr(String user_name, String user_sex, int user_age, Car car) {
this.user_name = user_name;
this.user_sex = user_sex;
this.user_age = user_age;
this.car = car;
}
... 省略set() get()方法 (这里小编就不再给出了)
2.创建spring-xml文件
<?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">
</beans>
2.1讲解" ref "属性的使用
1.创建一个bean,类型指向Car
<bean id="car" class="cn.itcast.spring.beans.domain.Car">
<property name="brand" value="Audi"></property>
<property name="price" value="200000"></property>
<property name="addr" value="BeiJing"></property>
</bean>
2.创建第二个bean,类型指向User
在这里插入代码片` <bean id="user" class="cn.itcast.spring.beans.domain.User_Caffr">
<constructor-arg value="ZhangSan" type="java.lang.String"></constructor-arg>
<constructor-arg value="男" type="java.lang.String"></constructor-arg>
<constructor-arg value="19" type="int"></constructor-arg>
<constructor-arg ref="car"></constructor-arg>
</bean>`
注意:ref属性是直接指向Car_Bean 的 ID ,亦可以写成,将属性提取出来写,也是同样指向Car_Bean的ID
<constructor-arg>
<ref bean="car"></ref>
</constructor-arg>
2.2讲解"type"属性的使用
1.创建一个包含 int 类型和 Double 类型的实体类成员变量
public class User_Add {
private String name;
private String sex;
private int age;
private Double money;
public User_Add(String name, String sex, Double money) {
this.name = name;
this.sex = sex;
this.money = money;
}
public User_Add(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
(...) 表示省略set()get()方法展出
注意:小编定义了两种构造器,当我们在配置文件配置"constructor-arg"参数的时候,系统怎么知道我们到底是配置的哪个构造器呢?难道是因为我们给出什么类型的数据他就自己解析什么类型的数据吗?所以这里我们要使用type属性来区分不同的参数,以至于实现不同的构造器!
3.spring-xml配置文件配置,小编定义了三个bean
- 普通配置
<bean id="user" class="cn.itcast.spring.beans.domain.User_Add">
<constructor-arg value="ZhangSan"></constructor-arg>
<constructor-arg value="Male"></constructor-arg>
<constructor-arg value="100.0"/>
</bean>
输出结果:
User_Add{name=‘ZhangSan’, sex=‘Male’, age=0, money=100.0}
虽然第三个参数没有指定type,但是我们传入的是一个浮点数类型,所以匹配了构造器的Double类型,所以这里money就被赋值为100.0,age(int)就没有被赋值
- 指出第三个参数的type为int类型
<bean id="user2" class="cn.itcast.spring.beans.domain.User_Add">
<constructor-arg value="LiSi"></constructor-arg>
<constructor-arg value="Female"></constructor-arg>
<constructor-arg value="100" type="int"/>
</bean>
输出结果:
User_Add{name=‘LiSi’, sex=‘Female’, age=100, money=null}
第三个参数指定type为int类型,我们传入的值为100,所以这里第三个参数为(int)类型的构造器就被匹配了,所以这里money没有被传入值,就变成了null
3.指出第三个参数的type为Double类型
<bean id="user3" class="cn.itcast.spring.beans.domain.User_Add">
<constructor-arg value="WangWu"></constructor-arg>
<constructor-arg value="Male"></constructor-arg>
<constructor-arg value="100.0" type="java.lang.Double"/>
</bean>
输出结果:
User_Add{name=‘WangWu’, sex=‘Male’, age=0,money=100.0}
第三个参数指定type为Double类型,我们传入的值为100.0,所以这里第三个参数为(Double)类型的构造器就被匹配了,所以这里age没有被传入值,就变成了0,money变成了100.0
细节补充:
- 细节一:指出第三个参数的type为int类型,但是我们传入浮点数
constructor-arg value=“100.0” type=“int”
这样是不可以的,因为type类型明确指出是int类型,但是你value值给出的是浮点型,所以这里编译都无法通过
-
细节二:指出第三个参数的type为Double类型,但是我们传入整型是可以的
-
细节三:double数据类型和Double数据类型一定要注意,type一定要对应,不然会抛异常”Unsatisfied dependency expressed through constructor parameter 2: Ambiguous argument values for parameter of type [java.lang.Double] - "did you specify the correct bean references as arguments?"
4.讲解 " ![CDATA[]] " 属性的使用
首先了解一个这个标签是干什么的?如何使用?在配置文件中,因为像 ‘<’ 这样的敏感标签,当你某些成员变量需要用到这样的敏感标签的情况下,spring配置文件是无法解析的,所以需要借助 ![CDATA[]] 标签来使用
- 基本使用:![CDATA[ values ]]
<property name="addr" >
<value><![CDATA[
shanghai^!@
]]></value>
</property>
- 补充:如果某成员变量想赋予空值,可以使用null
<property name="brand" >
<null/>
</property>
5.讲解内部bean的使用
这里小编还是利用 上面给出的两个实体类来讲解 首先先配置
根据 构造器配置beanpublic User_Caffr(String user_name, String user_sex, int user_age, Car car)
- 配置String user_name, String user_sex, int user_age
<bean id="user4" class="cn.itcast.spring.beans.domain.User_Caffr">
<constructor-arg value="MaWu"></constructor-arg>
<constructor-arg value="Male"></constructor-arg>
<constructor-arg value="25" type="int"/>
- 配置最后一个参数Car有多种配置方式 ref 和 内部 bean 配置方式,这里我们采用内部bean的配置方式配置
<constructor-arg >
<bean class="cn.itcast.spring.beans.domain.Car">
<property name="brand" >
<null/>
</property>
<property name="addr" >
<value><![CDATA[
shanghai^!@
]]></value>
</property>
<property name="price" value="300000"/>
</bean>
</constructor-arg>
不难发现,内置bean和普通的配置bean的过程是一致的,但是这里需要注意的是,内置的bean小编并没有给ID,因为外部也无法引用内置bean,所以这里不需要给出ID
好了,这里就是小编整理的关于Bean的属性使用了,如果有说错的地方或者说的不好的地方希望得到大家的意见和建议.