1、注入属性值的细节
我们在value中"" 这样写是报错的。
在X文档里面<>是特殊标记
如图所示:
解决问题:若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。
修改过后图示:
结果显示:
2、引用其他的Bean
组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用
1、引用其他的Bean的方法
1.在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
2.也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean
2、(方法1)在 Bean 的配置文件中, 可以通过 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
2.1、首先来写一个类Person(get,set方法,和toString()方法)
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", car=" + car +
'}';
}
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;
}
}
2.2可以使用property的ref属性建立bean之间的引用关系!
2.3、获取到的值为:
2.4、也可以使用内部Bean,跟上面等同
注意:内部Bean不能被外部引用,只能在内部使用
2.5、我们在引用其他bean的时候用构造器是不是一样的? 是不是也是用这样的方式来写< constructor - arg >
我们来举一个例子:
我们在Person类中(加入无参,有参的构造器)
注意:在有无参数的构造器中,创建Bean使用< constructor - arg >
在xml文件中写入:
Main里面写入:
结果显示:
3、注入参数详解:null 值和级联属性
可以使用专用的 元素标签为 Bean 的字符串或其它对象类型的属性注入 null 值
和 Struts、Hiberante 等框架一样,Spring 支持级联属性的配置。
3.1、null值操作
我们在Person里面给Car类赋值一个null值
注意写法:< constructor-arg >< null/ >< /constructor-arg >
xml文件中:
输出结果:
3.2、级联属性
首先在Car类里面加入set方法:
xml文件中写入:
结果显示:
上述步骤为:先给Person里面的 car赋值,然后再给car里面maxSpeed赋值,就叫做级联属性
3.2.1 问题::上述步骤为:先给Person里面的 car赋值,然后再给car里面maxSpeed赋值,如果我先不给car赋值,那这个时候它会自动的创建car属性,然后在给级联属性赋上吗?
首先car是空的,然后我们给car里面的maxSpeed赋值试一试结果
结果显示报错!!!!
所以在级联属性赋值的时候,我们有一个要注意的地方:
属性需要先初始化后才可以为级联属性赋值,否则会有异常
4、集合属性
-1、在 Spring中可以通过一组内置的 xml 标签(例如: , 或
在Person类里面我们可以包含几辆车,那么我们如何来写呢?
==4.1、集合属性之List
我们创建一个和beans等级的包,名为collections
把Person类里面的内容修改(加入list):
public class Person {
private String name;
private int age;
private List<Car> cars;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", cars=" + 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;
}
}
xml文件中:
结果显示:
4.2、集合属性之Map:
-1、Java.util.Map 通过 <map>
标签定义,
4.2.1、测试Map步骤如下:
在collections包下新建一个newPerson类:
public class newPerson {
private String name;
private int age;
private Map<String,Car> cars;
public String getName() {
return name;
}
@Override
public String toString() {
return "newPerson{" +
"name='" + name + '\'' +
", age=" + age +
", cars=" + cars +
'}';
}
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;
}
}
xml写入:
Main中写入:
结果显示:
4.3、集合属性之props:
我们在连接数据库的时候需要用户名,密码,jdbcurl,driver
我们来做一个数据库模拟测试。
步骤如下:
在collections下创建一个类,名:DataSource
public class DataSource {
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "DataSource{" +
"properties=" + properties +
'}';
}
}
xml文件中:
Main中:
结果显示 :
5、使用 utility scheme 定义集合
使用基本的集合标签定义集合时, 不能将集合作为独立的 Bean 定义, 导致其他 Bean 无法引用该集合, 所以无法在不同 Bean 之间共享集合.
可以使用 util schema 里的集合标签定义独立的集合 Bean. 需要注意的是, 必须在 根元素里添加 util schema 定义
步骤如下:
在xml文件中:
Main中:
结果显示:
6、使用 p 命名空间
-1、为了简化 XML 文件的配置,越来越多的 XML 文件采用属性而非子元素配置信息。
-2、Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 < bean> 元素属性的方式配置 Bean 的属性。
-3、使用 p 命名空间后,基于 XML 的配置方式将进一步简化
步骤如下:
xml文件中:
Main中:
结果显示:
通过p命名空间为bean的属性赋值,需要先导入p命名空间,相对于传统的配置方式更加的简介;