飞道的博客

hualinux spring 3.6:依赖注入(XML文件方式)的几种方式

530人阅读  评论(0)

目录

一、普通测试

1.1 建立无参hello

1.1.1 建立配置文件

1.1.2 代码

1.1.3 运行结果

1.1.4 总结

1.2 建立有参的hello

二、 属性注入

2.1 get和set注入

2.2 ref引用

三、构造函数注入

3.1 默认

3.2使用index索引匹配入参

3.3 按类型匹配入参

3.4 问题 相同class

四、 其它

4.1字面值

4.2 内部bean

4.2.1 例子

4.3 null值和级联属性

4.4 集合属性

4.5 集合属性

4.6 使用 utility scheme 定义集合

4.7 使用p命名空间


上章《hualinux spring 3.4:idea 2020.1 创建简单的spring》讲了如果使用iidea创建spring项目,并写了一个简单的helloWorld,现在这里基于这个项目讲依赖注入。

一、普通测试

在测试之前我把《hualinux spring 3.4:idea 2020.1 创建简单的spring》建立的java文件及xml配置文件全部删除,恢复空项目

1.1 建立无参hello

1.1.1 建立配置文件

src右击-->new-->XML Configuration File-->Spring config-->输入名字“ApplicationContext” 

ApplicationContext.xml配置文件如下:


  
  1. <!--配置bean-->
  2. <bean id="hello" class="com.hualinux.beans.Hello">
  3. <property name="name" value="Spring"/>
  4. </bean>

1.1.2 代码

src-->com.hualinux.beans.Hello.java


  
  1. package com.hualinux.beans;
  2. public class Hello {
  3. String name;
  4. public void helloTest(){
  5. System.out.println( "你好:"+name);
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. }

src-->com.hualinux.beans.Main.java


  
  1. package com.hualinux.beans;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Main {
  5. public static void main(String[] args) {
  6. //1. 创建 Spring 的 IOC 容器对象
  7. ApplicationContext ctx= new ClassPathXmlApplicationContext( "ApplicationContext.xml");
  8. //2. 从IOC容器中获取Bean实例
  9. Hello hello= (Hello) ctx.getBean( "hello");
  10. //3. 调用hello方法
  11. hello.helloTest();
  12. }
  13. }

1.1.3 运行结果

运行一下,怎运行前一章已经讲了,我这里就不说了

1.1.4 总结

在spring的xml配置中:

idBean 的名称

  • IOC 容器中必须是唯一的
  • id 没有指定,Spring 自动将权限定性类名作为 Bean 的名字
  • id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔

Spring ApplicationContext 容器

Application Context spring 中较高级的容器。和 BeanFactory 类似,它可以加载配置文件中定义的 bean,将所有的 bean 集中在一起,当有请求的时候分配 bean 另外,它增加了企业所需要的功能,比如,从属性文件中解析文本信息和将事件传递给所指定的监听器。这个容器在 org.springframework.context.ApplicationContext interface 接口中定义。

ApplicationContext 包含 BeanFactory 所有的功能,一般情况下,相对于 BeanFactoryApplicationContext 会更加优秀。当然,BeanFactory 仍可以在轻量级应用中使用,比如移动设备或者基于 applet 的应用程序。

最常被使用的 ApplicationContext 接口实现:

  1. FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。
  2. ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
  3. WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean

1.2 建立有参的hello

如果修改为有参的构造器得需要一个默认的无参构造器

//idea测试发现不加也行,但建议还是加上

复制Hello.java变成Hello2.java


  
  1. public class Hello2 {
  2. String name;
  3. public void helloTest(){
  4. System.out.println( "你好:"+name);
  5. }
  6. public Hello2() {
  7. }
  8. public Hello2(String name) {
  9. this.name = name;
  10. }
  11. }

ApplicationContext.xml配置文件添加如下内容


  
  1. <!--配置bean-->
  2. <bean id="hello2" class="com.hualinux.beans.Hello2">
  3. <constructor-arg name="name" value="Spring2"/>
  4. </bean>

Main.java,修改如下:


  
  1. package com.hualinux.beans;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Main {
  5. public static void main(String[] args) {
  6. //1. 创建 Spring 的 IOC 容器对象
  7. ApplicationContext ctx= new ClassPathXmlApplicationContext( "ApplicationContext.xml");
  8. //2. 从IOC容器中获取Bean实例
  9. Hello hello= (Hello) ctx.getBean( "hello");
  10. Hello2 hello2= (Hello2) ctx.getBean( "hello2");
  11. //3. 调用hello方法
  12. hello.helloTest();
  13. hello2.helloTest();
  14. }
  15. }

运行结果为:

 

二、 属性注入

2.1 get和set注入

属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象

属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值

属性注入是实际应用中最常用的注入方式

例子就是上面的无参hello

 

2.2 ref引用

  1. 组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用
  2. 在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref  属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
  3. 也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean

下面是一个配置例子,需要建立Car类,并有3个属性;也需要建立Person类,3个属性,其中一个包括car ,后面将贴出代码


  
  1. <bean id="car" class="com.hualinux.beans.Car">
  2. <constructor-arg value="BMW X6" />
  3. <constructor-arg value="进口宝马" />
  4. <constructor-arg value="1000000" />
  5. </bean>
  6. <bean id="person" class="com.hualinux.beans.Person" >
  7. <property name="name" value="华" />
  8. <property name="age" value="20" />
  9. <property name="car" ref="car" />
  10. </bean>

三、构造函数注入

通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。

构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性

3.1 默认

例子1,上面的hello2

例子2:

src-->com.hualinux.beans.Car.java


  
  1. package com.hualinux.beans;
  2. public class Car {
  3. private String brand;
  4. private String corp;
  5. private float price;
  6. private int maxSpeed;
  7. // 先弄3个参数,最后一个不用
  8. public Car(String brand, String corp, float price) {
  9. this.brand = brand;
  10. this.corp = corp;
  11. this.price= price;
  12. }
  13. @Override
  14. public String toString() {
  15. return "Car{" +
  16. "brand='" + brand + '\'' +
  17. ", corp='" + corp + '\'' +
  18. ", price=" + price +
  19. ", maxSpeed=" + maxSpeed +
  20. '}';
  21. }
  22. }

ApplicationContext.xml配置文件


  
  1. <!--通过构造方法来配置 bean的属性-->
  2. <!--为了方便先弄三个参数的-->
  3. <bean id="car" class="com.hualinux.beans.Car">
  4. <constructor-arg value="BMW X6" />
  5. <constructor-arg value="进口宝马" />
  6. <constructor-arg value="1000000"/>
  7. </bean>

Main.java


  
  1. package com.hualinux.beans;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Main {
  5. public static void main(String[] args) {
  6. //1. 创建 Spring 的 IOC 容器对象
  7. ApplicationContext ctx= new ClassPathXmlApplicationContext( "ApplicationContext.xml");
  8. //2. 从IOC容器中获取Bean实例
  9. Hello hello= (Hello) ctx.getBean( "hello");
  10. Hello2 hello2= (Hello2) ctx.getBean( "hello2");
  11. Car car= (Car) ctx.getBean( "car");
  12. System.out.println(car.toString());
  13. //3. 调用hello方法
  14. hello.helloTest();
  15. hello2.helloTest();
  16. }
  17. }

运行结果为: 

 

3.2使用index索引匹配入参

ApplicationContext.xml配置文件中id为car的修改为如下:


  
  1. <!--索引方式-->
  2. <bean id="car" class="com.hualinux.beans.Car">
  3. <constructor-arg value="BMW X6" index="0" />
  4. <constructor-arg value="进口宝马" index="1" />
  5. <constructor-arg value="1000000" index="2"/>
  6. </bean>

再次运行Main.java,结果如下:

 

3.3 按类型匹配入参

ApplicationContext.xml配置文件中id为car的修改为如下:


  
  1. <bean id="car" class="com.hualinux.beans.Car">
  2. <constructor-arg value="BMW X6" type="java.lang.String"/>
  3. <constructor-arg value="进口宝马" type="java.lang.String" />
  4. <constructor-arg value="1000000" type="float"/>
  5. </bean>

运行Main.java 结果也是相同的

 

3.4 问题 相同class

src-->com.hualinux.beans.Car.java 建立多一个构造函数


  
  1. // 不使用第3个属性
  2. public Car(String brand, String corp, int maxSpeed) {
  3. this.brand = brand;
  4. this.corp = corp;
  5. this.maxSpeed = maxSpeed;
  6. }

ApplicationContext.xml配置文件中添加:


  
  1. <bean id="car2" class="com.hualinux.beans.Car">
  2. <constructor-arg value="法拉利" />
  3. <constructor-arg value="进口" />
  4. <constructor-arg value="320" />
  5. </bean>

这样才有2个car了


  
  1. <bean id="car2" class="com.hualinux.beans.Car">
  2. <constructor-arg value="法拉利" />
  3. <constructor-arg value="进口" />
  4. <constructor-arg value="320" />
  5. </bean>
  6. <bean id="car" class="com.hualinux.beans.Car">
  7. <constructor-arg value="BMW X6" type="java.lang.String"/>
  8. <constructor-arg value="进口宝马" type="java.lang.String" />
  9. <constructor-arg value="1000000" type="float"/>
  10. </bean>

Main添加多一个car2,总代码如下:


  
  1. package com.hualinux.beans;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Main {
  5. public static void main(String[] args) {
  6. //1. 创建 Spring 的 IOC 容器对象
  7. ApplicationContext ctx= new ClassPathXmlApplicationContext( "ApplicationContext.xml");
  8. //2. 从IOC容器中获取Bean实例
  9. Hello hello= (Hello) ctx.getBean( "hello");
  10. Hello2 hello2= (Hello2) ctx.getBean( "hello2");
  11. Car car= (Car) ctx.getBean( "car");
  12. System.out.println(car.toString());
  13. Car car2= (Car) ctx.getBean( "car2");
  14. System.out.println(car2.toString());
  15. //3. 调用hello方法
  16. hello.helloTest();
  17. hello2.helloTest();
  18. }
  19. }

结果:320是时速即变成了价格吧

解决方法:

指定type匹配类型也行(因为2个构造函数,用的是重载)

注:用index固定好参数顺序是不行的


  
  1. <!-- 使用构造器注入值可以指定参数的位置和参数类型!以区分重载构造器!-->
  2. <bean id="car2" class="com.hualinux.beans.Car">
  3. <constructor-arg value="法拉利" type="java.lang.String" />
  4. <constructor-arg value="进口" type="java.lang.String" />
  5. <constructor-arg value="320" type="int"/>
  6. </bean>

再次运行发现正常了,如下图所示:

 

四、 其它

4.1字面值

  1. 字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。
  2. 基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式
  3. 若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来

 

4.2 内部bean

  1. 当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean. 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里, 不需要设置任何 id 或 name 属性
  2. 内部 Bean 不能使用在任何其他地方

4.2.1 例子

src-->com.hualinux.beans.Person.java


  
  1. package com.hualinux.beans;
  2. public class Person {
  3. private String name;
  4. private int age;
  5. private Car car;
  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 Car getCar() {
  19. return car;
  20. }
  21. public void setCar(Car car) {
  22. this.car = car;
  23. }
  24. public Person() {
  25. }
  26. public Person(String name, int age, Car car) {
  27. this.name = name;
  28. this.age = age;
  29. this.car = car;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Person{" +
  34. "name='" + name + '\'' +
  35. ", age=" + age +
  36. ", car=" + car +
  37. '}';
  38. }
  39. }

ApplicationContext.xml配置文件中添加:


  
  1. <!-- 内部bean,不能补外部引用,只能内部使用 -->
  2. <bean id="person" class="com.hualinux.beans.Person" >
  3. <property name="name" value="华" />
  4. <property name="age" value="20" />
  5. <property name="car">
  6. <bean id="car3" class="com.hualinux.beans.Car">
  7. <constructor-arg value="慕尚" />
  8. <constructor-arg value="进口宾利" />
  9. <constructor-arg value="305" type="int" />
  10. </bean>
  11. </property>
  12. </bean>

Main.java中添加如下配置


  
  1. //在Main中添加
  2. Person person= (Person) ctx.getBean( "person");
  3. System.out.println(person.toString());

运行结果为:

 

4.3 null值和级联属性

  1. 可以使用专用的 <null/> 元素标签为 Bean 的字符串或其它对象类型的属性注入 null 值
  2. 和 Struts、Hiberante 等框架一样,Spring 支持级联属性的配置

ApplicationContext.xml配置文件中添加:


  
  1. <bean id="person2" class="com.hualinux.beans.Person" >
  2. <property name="name" value="华2" />
  3. <property name="age" value="20" />
  4. <!-- 测试赋值null -->
  5. <property name="car" > <null/> </property>
  6. </bean>


  
  1. <bean id="person2" class="com.hualinux.beans.Person" >
  2. <constructor-arg value="华2" />
  3. <constructor-arg value="20" />
  4. <!-- 测试赋值null -->
  5. <constructor-arg > <null/> </constructor-arg>
  6. </bean>

Main.jva添加


  
  1. Person person2= (Person) ctx.getBean( "person2");
  2. System.out.println(person2.toString());

运行结果:

 

级联属性赋值:

修改ApplicationContext.xml配置文件中的person2

为了方便我在Car.java中添加了getter和setter方法


  
  1. <bean id="person2" class="com.hualinux.beans.Person" >
  2. <constructor-arg value="华2" />
  3. <constructor-arg value="20" />
  4. <!-- 测试赋值null -->
  5. <!--<constructor-arg ><null/></constructor-arg>-->
  6. <!-- 级联属性赋值。注意:属性需要先初始化才可以为级联属性赋值,否则会有异常,和struts2不同-->
  7. <constructor-arg ref="car"/>
  8. <!-- Car类中的maxSpeed要添加setter方法,否则不生效-->
  9. <property name="car.maxSpeed" value="250"/>
  10. </bean>

4.4 集合属性

  1. 在 Spring中可以通过一组内置的 xml 标签(例如: <list>, <set> 或 <map>) 来配置集合属性.
  2. 配置 java.util.List 类型的属性, 需要指定 <list>  标签, 在标签里包含一些元素. 这些标签可以通过 <value> 指定简单的常量值, 通过 <ref> 指定对其他 Bean 的引用. 通过<bean> 指定内置 Bean 定义. 通过 <null/> 指定空元素. 甚至可以内嵌其他集合.
  3. 数组的定义和 List 一样, 都使用 <list>
  4. 配置 java.util.Set 需要使用 <set> 标签, 定义元素的方法与 List 一样.

 

src-->com.hualinux.beans.collection.Car.java(和src-->com.hualinux.beans.Car.java一样)


  
  1. package com.hualinux.beans.collection;
  2. public class Car {
  3. private String brand;
  4. private String corp;
  5. private float price;
  6. private int maxSpeed;
  7. // 先弄3个参数,最后一个不用
  8. public Car(String brand, String corp, float price) {
  9. this.brand = brand;
  10. this.corp = corp;
  11. this.price= price;
  12. }
  13. // 不使用第3个属性
  14. public Car(String brand, String corp, int maxSpeed) {
  15. this.brand = brand;
  16. this.corp = corp;
  17. this.maxSpeed = maxSpeed;
  18. }
  19. @Override
  20. public String toString() {
  21. return "Car{" +
  22. "brand='" + brand + '\'' +
  23. ", corp='" + corp + '\'' +
  24. ", price=" + price +
  25. ", maxSpeed=" + maxSpeed +
  26. '}';
  27. }
  28. public String getBrand() {
  29. return brand;
  30. }
  31. public void setBrand(String brand) {
  32. this.brand = brand;
  33. }
  34. public String getCorp() {
  35. return corp;
  36. }
  37. public void setCorp(String corp) {
  38. this.corp = corp;
  39. }
  40. public float getPrice() {
  41. return price;
  42. }
  43. public void setPrice(float price) {
  44. this.price = price;
  45. }
  46. public int getMaxSpeed() {
  47. return maxSpeed;
  48. }
  49. public void setMaxSpeed(int maxSpeed) {
  50. this.maxSpeed = maxSpeed;
  51. }
  52. }

src-->com.hualinux.beans.collection.Person.java如下:


  
  1. package com.hualinux.beans.collection;
  2. import java.util.List;
  3. public class Person {
  4. private String name;
  5. private int age;
  6. private List<com.hualinux.beans.collection.Car> car;
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public void setAge(int age) {
  17. this.age = age;
  18. }
  19. public List<com.hualinux.beans.collection.Car> getCar() {
  20. return car;
  21. }
  22. public void setCar(List<com.hualinux.beans.collection.Car> car) {
  23. this.car = car;
  24. }
  25. @Override
  26. public String toString() {
  27. return "Person{" +
  28. "name='" + name + '\'' +
  29. ", age=" + age +
  30. ", car=" + car +
  31. '}';
  32. }
  33. }

src右击-->new-->XML Configuration File-->Spring config-->输入名字“collection“


  
  1. <bean id="car" class="com.hualinux.beans.collection.Car">
  2. <constructor-arg value="BMW X6" />
  3. <constructor-arg value="进口宝马" />
  4. <constructor-arg value="1000000" />
  5. </bean>
  6. <!-- 使用构造器注入值可以指定参数的位置和参数类型!以区分重载构造器!-->
  7. <bean id="car2" class="com.hualinux.beans.collection.Car">
  8. <constructor-arg value="法拉利" index="0" />
  9. <constructor-arg value="进口" index="1" />
  10. <constructor-arg value="320" index="2" />
  11. </bean>
  12. <bean id="car3" class="com.hualinux.beans.collection.Car">
  13. <constructor-arg value="911" type="java.lang.String" />
  14. <constructor-arg value="进口保时捷" type="java.lang.String" />
  15. <constructor-arg value="340" type="int" />
  16. </bean>
  17. <bean id="person3" class="com.hualinux.beans.collection.Person">
  18. <property name="name" value="Mike"/>
  19. <property name="age" value="27"/>
  20. <property name="car">
  21. <list>
  22. <ref bean="car" />
  23. <ref bean="car2" />
  24. <ref bean="car3" />
  25. </list>
  26. </property>
  27. </bean>

src-->com.hualinux.beans.collection.Main.java


  
  1. package com.hualinux.beans.collection.com.hualinux.beans.collection;
  2. import com.hualinux.beans.collection.Person;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class Main {
  6. public static void main(String[] args) {
  7. ApplicationContext ctx= new ClassPathXmlApplicationContext( "collection.xml");
  8. // 这里的Person为com.hualinux.beans.collection.Person
  9. Person person= (Person) ctx.getBean( "person3");
  10. System.out.println(person.toString());
  11. }
  12. }

运行结果:

Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='进口宝马', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='进口', price=320.0, maxSpeed=0}, Car{brand='911', corp='进口保时捷', price=0.0, maxSpeed=340}]}

 

4.5 集合属性

  • Java.util.Map 通过 <map> 标签定义, <map> 标签里可以使用多个 <entry> 作为子标签. 每个条目包含一个键和一个值.
  • 必须在 <key> 标签里定义键
  • 因为键和值的类型没有限制, 所以可以自由地为它们指定 <value>, <ref>, <bean> 或 <null> 元素.
  • 可以将 Map 的键和值作为 <entry> 的属性定义: 简单常量使用 key 和 value 来定义; Bean 引用通过 key-ref 和 value-ref 属性定义
  • 使用 <props> 定义 java.util.Properties, 该标签使用多个 <prop> 作为子标签. 每个 <prop> 标签必须定义 key 属性.

 

src-->com.hualinux.beans.collection.MapPerson.java


  
  1. package com.hualinux.beans.collection;
  2. import java.util.Map;
  3. public class MapPerson {
  4. private String name;
  5. private int age;
  6. private Map<String,Car> cars;
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public void setAge(int age) {
  17. this.age = age;
  18. }
  19. public Map<String, Car> getCars() {
  20. return cars;
  21. }
  22. public void setCars(Map<String, Car> cars) {
  23. this.cars = cars;
  24. }
  25. @Override
  26. public String toString() {
  27. return "MapPerson{" +
  28. "name='" + name + '\'' +
  29. ", age=" + age +
  30. ", cars=" + cars +
  31. '}';
  32. }
  33. }

collection.xml配置文件中添加如下内容


  
  1. <!-- 配置Map属性值 -->
  2. <bean id="mapPerson" class="com.hualinux.beans.collection.MapPerson">
  3. <property name="name" value="Rose" />
  4. <property name="age" value="28" />
  5. <property name="cars">
  6. <!-- 使用map节点及map的entry子节点配置Map类型成员变更-->
  7. <map>
  8. <entry key="AA" value-ref="car"/>
  9. <entry key="BB" value-ref="car2" />
  10. </map>
  11. </property>
  12. </bean>

com.hualinux.beans.collection.Main.java是main中添加


  
  1. MapPerson mapPerson= (MapPerson) ctx.getBean( "mapPerson");
  2. System. out.println(mapPerson);

运行结果如下:


  
  1. Person{name= 'Mike', age= 27, car=[Car{brand= 'BMW X6', corp= '进口宝马', price= 1000000.0, maxSpeed= 0}, Car{brand= '法拉利', corp= '进口', price= 320.0, maxSpeed= 0}, Car{brand= '911', corp= '进口保时捷', price= 0.0, maxSpeed= 340}]}
  2. MapPerson{name= 'Rose', age= 28, cars={AA=Car{brand= 'BMW X6', corp= '进口宝马', price= 1000000.0, maxSpeed= 0}, BB=Car{brand= '法拉利', corp= '进口', price= 320.0, maxSpeed= 0}}}

例2 模拟数据库配置连接

src-->com.hualinux.beans.collection.DataSource.java


  
  1. package com.hualinux.beans.collection;
  2. import java.util.Properties;
  3. public class DataSource {
  4. private Properties properties;
  5. public Properties getProperties() {
  6. return properties;
  7. }
  8. public void setProperties(Properties properties) {
  9. this.properties = properties;
  10. }
  11. @Override
  12. public String toString() {
  13. return "DataSource{" +
  14. "properties=" + properties +
  15. '}';
  16. }
  17. }

collection.xml配置文件中添加


  
  1. <!-- 配置 Properties 属性值 -->
  2. <bean id="dataSource" class="com.hualinux.beans.collection.DataSource">
  3. <property name="properties">
  4. <!-- 使用 props 和 prop 子节点来为 properties 属性赋值-->
  5. <props>
  6. <prop key="user">root </prop>
  7. <prop key="password">root </prop>
  8. <prop key="jdbcUrl">jdbc:mysql://test </prop>
  9. <prop key="driverClass">com.mysql.jdbc.Driver </prop>
  10. </props>
  11. </property>
  12. </bean>

com.hualinux.beans.collection.Main.java,的main中添加,如下代码:


  
  1. DataSource dataSource= (DataSource) ctx.getBean( "dataSource");
  2. System. out.println(dataSource.getProperties());

运行结果:


  
  1. Person{name= 'Mike', age= 27, car=[Car{brand= 'BMW X6', corp= '进口宝马', price= 1000000.0, maxSpeed= 0}, Car{brand= '法拉利', corp= '进口', price= 320.0, maxSpeed= 0}, Car{brand= '911', corp= '进口保时捷', price= 0.0, maxSpeed= 340}]}
  2. MapPerson{name= 'Rose', age= 28, cars={AA=Car{brand= 'BMW X6', corp= '进口宝马', price= 1000000.0, maxSpeed= 0}, BB=Car{brand= '法拉利', corp= '进口', price= 320.0, maxSpeed= 0}}}
  3. {password=root, driverClass=com.mysql.jdbc.Driver, jdbcUrl=jdbc:mysql: //test, user=root}

4.6 使用 utility scheme 定义集合

  • 使用基本的集合标签定义集合时, 不能将集合作为独立的 Bean 定义, 导致其他 Bean 无法引用该集合, 所以无法在不同 Bean 之间共享集合.
  • 可以使用 util schema 里的集合标签定义独立的集合 Bean. 需要注意的是, 必须在 <beans> 根元素里添加 util schema 定义

collection.xml配置文件中添加


  
  1. <!-- 配置单例集合bean,以供多个bean进行引用,需要导入util 命名空间-->
  2. <util:list id="cars">
  3. <ref bean="car" />
  4. <ref bean="car2" />
  5. </util:list>
  6. <bean id="person4" class="com.hualinux.beans.collection.Person">
  7. <property name="name" value="Jack"/>
  8. <property name="age" value="29"/>
  9. <property name="car" ref="cars"/>
  10. </bean>

list会提示到不到,点一下按Alt+Enter

这后就显示正常了 

 

4.7 使用p命名空间

  • 为了简化 XML 文件的配置,越来越多的 XML 文件采用属性而非子元素配置信息。
  • Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。
  • 使用 p 命名空间后,基于 XML 的配置方式将进一步简化

collection.xml配置文件中添加


  
  1. <!-- 通过p命名空间为bean的属性赋值,需要先导入p命名空间。相于于传统配置方式更加简洁 -->
  2. <bean id="person5" class="com.hualinux.beans.collection.Person"
  3. p:name= "Queen" p:car-ref= "cars" />

 上面p是红色的话用Alt+Enter就会自动为配置添加相关的关联,这样p命名空间就可以使用了。

com.hualinux.beans.collection.Main.java,的main中添加,如下代码:


  
  1. Person person5= (Person) ctx.getBean( "person5");
  2. System. out.println(person5.toString());

运行结果为:


  
  1. Person{name= 'Mike', age= 27, car=[Car{brand= 'BMW X6', corp= '进口宝马', price= 1000000.0, maxSpeed= 0}, Car{brand= '法拉利', corp= '进口', price= 320.0, maxSpeed= 0}, Car{brand= '911', corp= '进口保时捷', price= 0.0, maxSpeed= 340}]}
  2. MapPerson{name= 'Rose', age= 28, cars={AA=Car{brand= 'BMW X6', corp= '进口宝马', price= 1000000.0, maxSpeed= 0}, BB=Car{brand= '法拉利', corp= '进口', price= 320.0, maxSpeed= 0}}}
  3. {password=root, driverClass=com.mysql.jdbc.Driver, jdbcUrl=jdbc:mysql: //test, user=root}
  4. Person{name= 'Queen', age= 0, car=[Car{brand= 'BMW X6', corp= '进口宝马', price= 1000000.0, maxSpeed= 0}, Car{brand= '法拉利', corp= '进口', price= 320.0, maxSpeed= 0}]}


转载:https://blog.csdn.net/hualinux/article/details/106872039
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场