1. 字面值
- 字面值是指可用字符串表示的值,可以通过<value>元素标签或value属性进行注入。
- 基本数据类型及其封装类,String等类型都可以采用字面值的注入方式。比如:
<bean id="car" class="com.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="AShanghai" index="1"></constructor-arg>
<constructor-arg value="3000" type="int"></constructor-arg>
</bean>
也可以写成
<bean id="car" class="com.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="AShanghai" index="1"></constructor-arg>
<constructor-arg type="int">
<value>3000</value>
</constructor-arg>
</bean>
- 若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来。比如:
<bean id="car" class="com.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="<AShanghai>" index="1"></constructor-arg>
<constructor-arg value="3000" type="int"></constructor-arg>
</bean>
第3行中的“<AShanghai>”中的<>是特殊字符,如果不用<![CDATA[]]>包裹起来就会报错,这时可以写成:
<bean id="car" class="com.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg index="1">
<value><![CDATA[<Shanghai>]]></value>
</constructor-arg>
<constructor-arg value="3000" type="int"></constructor-arg>
</bean>
2. 引用其他Bean
在实际开发中,Bean直接会相互进行引用。比如我们有Car类和Person类:
Car类:
package com.spring.beans;
public class Car {
private String brand;
private String corp;
private int price;
private double maxSpeed;
public Car(String brand, String corp, int price) {
super();
this.brand = brand;
this.corp = corp;
this.price = price;
}
public Car(String brand, String corp, double maxSpeed) {
super();
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price + ", maxSpeed=" + maxSpeed + "]";
}
}
Person类:
package com.spring.beans;
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;
}
public Person(String name, int age, Car car) {
super();
this.name = name;
this.age = age;
this.car = car;
}
}
2.1 利用ref
这里Person类引用了Car类,那么在配置Bean时可以这样配置:
<bean id="car2" class="com.spring.beans.Car">
<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
<constructor-arg value="AShanghai" type="java.lang.String"></constructor-arg>
<constructor-arg value="200" type="double"></constructor-arg>
</bean>
<bean id = "person" class = "com.spring.beans.Person">
<property name = "name" value = "Tom"></property>
<property name = "age" value = "24"></property>
<property name = "car" ref = "car2"></property>
</bean>
<property name = "car" ref = "car2"></property>这句话就利用<ref>元素或ref属性来建立了Person和Car两个Bean直接的引用关系。
2.2 内部Bean
在属性或构造器里包含Bean的声明,这样的Bean称为内部Bean,且不能被外部引用,只能在内部使用。
这时Bean配置如下:
<bean id="car2" class="com.spring.beans.Car">
<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
<constructor-arg value="AShanghai" type="java.lang.String"></constructor-arg>
<constructor-arg value="200" type="double"></constructor-arg>
</bean>
<bean id = "person" class = "com.spring.beans.Person">
<property name = "name" value = "Tom"></property>
<property name = "age" value = "24"></property>
<!-- 可以使用property的ref属性来建立bean之间的引用关系
<property name = "car" ref = "car2"></property>
-->
<!-- 内部Bean -->
<property name="car">
<bean class="com.spring.beans.Car">
<constructor-arg value="Ford" type="java.lang.String"></constructor-arg>
<constructor-arg value="Beijing" type="java.lang.String"></constructor-arg>
<constructor-arg value="2000000" type="double"></constructor-arg>
</bean>
3. null值和级联属性
可以使用专用的<null/>元素标签为Bean的字符串或其它对象类型的属性注入null值。
比如输入<constructor-arg ><null/></constructor-arg>就表示其对应的属性值为null。
级联属性的方法如下:
<bean id = "person2" class = "com.spring.beans.Person">
<constructor-arg value="Jerry"></constructor-arg>
<constructor-arg value="25"></constructor-arg>
<constructor-arg ref="car"></constructor-arg>
<!-- 测试赋值null
<constructor-arg ><null/></constructor-arg>
-->
<!-- 为级联属性赋值 属性需要先初始化后才能为级联属性赋值,否则会有异常-->
<property name = "car.price" value = "300000"></property>
<property name = "car.maxSpeed" value = "250"></property>
</bean>
4. 集合属性
在Spring里面可以通过一组内置的xml标签(比如:<list>,<set>或<map>)来配置集合属性:
配置java.util.List类型的属性,需要制定<list>标签;配置java.util.Set类型的属性,需要制定<set>标签。
在标签里包含一些元素,这些标签可以通过<value>制定简单的常量值,也可以通过<ref>指定对其它Bean的引用。
定义一个新的Person类,把之前的Car类型换成List<Car>变成一个集合:
package com.spring.beans.collection;
import com.spring.beans.*;
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 + "]";
}
public Person(String name, int age, List<Car> cars) {
super();
this.name = name;
this.age = age;
this.cars = cars;
}
public Person() {
}
}
在Bean里面配置集合属性:
<!-- 测试如何配置集合属性 -->
<bean id = "person3" class = "com.spring.beans.collection.Person">
<property name = "name" value = "Mike"></property>
<property name = "age" value = "18"></property>
<property name = "cars">
<list>
<ref bean = "car"/>
<ref bean = "car2"/>
</list>
</property>
</bean>
最后写一个新的Main:
package com.spring.beans.collection;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) ctx.getBean("person3");
System.out.println(person);
}
}
集合属性还剩下一点内容,然后属性配置要剩下一点内容,留着下次博客再讲吧!