发表于: 2017-12-12 21:18:36

1 587


今天完成的事:

一 、 Spring 支持 3 种依赖注入的方式 

属性注入

构造器注入 

工厂方法注入(很少使用)


(一)属性注入

Person的类package com.jcy.Spring03;

import java.util.List;

import java.util.Map;

public class Person {

private String name;

private int age;

private Car car;

private List<Car> cars;

private Map<String,Car> mapCars;

public void setMapCars(Map<String, Car> mapCars) {

this.mapCars = mapCars;

}

public void setCars(List<Car> cars) {

this.cars = cars;

}

public void setName(String name) {

this.name = name;

}

public void setAge(int age) {

this.age = age;

}

public void setCar(Car car) {

this.car = car;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + ", car=" + car

+ ", cars=" + cars + ", mapCars=" + mapCars + "]";

}

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

public Person() {

// TODO Auto-generated constructor stub

}

}


测试方法

 <!-- 属性注入的方式-->

    <!-- 为属性赋值 -->

    <!-- 使用无参构造器并通过属性注入: 通过 setter 方法注入属性值 -->

    <bean id="person" class="com.jcy.Spring03.Person">

        <property name="name" value="King"/>

        <property name="age" value="12"/>

    </bean>

    <bean id="person2" class="com.jcy.Spring03.Person">

    <property name="name">

    <value>"Jack"</value>

    </property>

    <property name="age">

    <value>23</value>

    </property>

    </bean>

   <!-- --> 

     <bean id="person3" class="com.jcy.Spring03.Person">

    <property name="name">

    <!-- 若字面值中包含特殊字符, 则可以使用 DCDATA 来进行赋值. -->

    <value><![CDATA[<Jack>]]></value>

    </property>

    <property name="age">

    <value>23</value>

    </property>

    </bean>

(二)构造方法注入

Car的类

package com.jcy.Spring03;

public class Car {

private String name;

private String city;

private int time;

private double price;

public void setName(String name) {

this.name = name;

}

public void setCity(String city) {

this.city = city;

}

public void setTime(int time) {

this.time = time;

}

public void setPrice(double price) {

this.price = price;

}

public Car(String name, String city, int time) {

super();

this.name = name;

this.city = city;

this.time = time;

}

public Car(String name, String city, double price) {

super();

this.name = name;

this.city = city;

this.price = price;

}

// public Car(String name, String city, int time) {

// super();

// this.name = name;

// this.city = city;

// this.time = time;

//

// }

@Override

public String toString() {

return "Car [name=" + name + ", city=" + city + ", time=" + time

+ ", price=" + price + "]";

}

public Car(){

}

}

beam.xml文件配置

    <!-- 通过构造器注入属性值 -->

    <!-- 要求: 在 Bean 中必须有对应的构造器. 按照构造方法的顺序进行对应 -->

     <bean id="car" class="com.jcy.Spring03.Car">

      <constructor-arg value="Rose"></constructor-arg>

      <constructor-arg value="ShangHai"></constructor-arg>

      <constructor-arg value="21"></constructor-arg>

     </bean>

 <!-- 若一个 bean 存在有多个构造器, 如何通过构造器来为 bean 的属性赋值 -->

<!-- 可以根据value、 index 和 type 进行更加精确的定位.-->

     <bean id="car1" class="com.jcy.Spring03.Car">

      <constructor-arg value="BMW" index="0"></constructor-arg>

      <constructor-arg value="ShangHai" index="1" type="java.lang.String"></constructor-arg>

      <constructor-arg value="21" index="2" type="double"></constructor-arg>

     </bean>

二、引用其他的bean (一个类中存在指向其他的类的属性)

组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用 

Bean 的配置文件中, 可以通过 <ref> 元素或 ref  属性Bean 的属性或构造器参数指定对 Bean 的引用

 <bean id="person4" class="com.jcy.Spring03.Person">

     <!-- 通过 ref 属性值指定当前属性指向哪一个 bean! -->

      <property name="name" value="King"/>

        <property name="age" value="32"/>

  <property name="car" ref="car1"></property>

     </bean>


也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean

 <!-- 内部 bean, 类似于匿名内部类对象. 不能被外部的 bean 来引用, 也没有必要设置 id 属性 -->

    <bean id="person5" class="com.jcy.Spring03.Person">

      <property name="name" value="King"/>

        <property name="age" value="32"/>

  <property name="car">

  <bean class="com.jcy.Spring03.Car">

  <property name="name" value="DAZONG"></property>

  <property name="city" value="YUNNAN"></property>

  <property name="time" value="2"></property>

  <property name="price" value="2000000"></property>

  </bean>

  </property>

     </bean>


三、设置集合属性    http://blog.csdn.net/xlgen157387/article/details/40349929

   Spring可以通过一组内置的 xml 标签(例如: <list>, <set> <map>) 来配置集合属性. 

配置 java.util.List 类型的属性, 需要指定 <list>  标签, 在标签里包含一些元素. 这些标签可以通过 <value> 指定简单的常量值, 通过 <ref> 指定对其他 Bean 的引用. 通过<bean> 指定内置 Bean 定义. 通过 <null/> 指定空元素. 甚至可以内嵌其他集合. 

数组的定义和 List 一样, 都使用 <list>

配置 java.util.Set 需要使用 <set> 标签, 定义元素的方法与 List 一样.

  <!-- 装配集合属性 -->

    <bean id="person6" class="com.jcy.Spring03.Person">

      <property name="name" value="King"/>

        <property name="age" value="32"/>

  <property name="cars">

  <list>

  <ref bean="car1" />

  <ref bean="car"/>

  </list>

  </property>

     </bean>


也可以定义公用集合类型     

    xmlns:util="http://www.springframework.org/schema/util

<!-- 声明集合类型的 bean -->

  <util:list id="cars">

<ref bean="car"/>

<ref bean="car1"/>

 </util:list>

 

   <bean id="person7" class="com.jcy.Spring03.Person">

      <property name="name" value="King"></property>

        <property name="age" value="32"></property>

  <property name="cars" ref="cars">

  </property>

     </bean>

Java.util.Map 通过 <map> 标签定义, <map> 标签里可以使用多个 <entry> 作为子标签. 每个条目包含一个键和一个值

必须在 <key> 标签里定义键 

因为键和值的类型没有限制, 所以可以自由地为它们指定 <value>, <ref>, <bean> <null> 元素.

可以将 Map 的键和值作为 <entry> 的属性定义: 简单常量使用 key value 来定义; Bean 引用通过 key-ref value-ref 属性定义 

<util:map id="mapCars">

  <entry key="MAPCAR1" value-ref="car1"></entry>

  <entry key="MAPCAR" value-ref="car"></entry>

 </util:map>


使用 <props> 定义 java.util.Properties, 该标签使用多个 <prop> 作为子标签. 每个 <prop> 标签必须定义 key 属性.   

      private Properties pp;//Properties的使用  

  1. <!-- 给属性集合配置 -->  
  2. <property name="pp">  
  3.     <props>  
  4.         <prop key="pp1">abcd</prop>  
  5.         <prop key="pp2">hello</prop>  
  6.     </props>  
  7. </property> 


   

四、使用p命名空间

为了简化 XML 文件的配置,越来越多的 XML 文件采用属性而非子元素配置信息。 

Spring 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。

使用 p 命名空间后,基于 XML 的配置方式将进一步简化


 <bean id="person7" class="com.jcy.Spring03.Person" p:name="GUOWANG" p:age="100" ></bean>

     

今天遇的问题: 

            org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 80 in XML document from class path resource [bean.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 80; columnNumber: 86; 与元素类型 "bean" 相关联的属性 "p:name" 的前缀 "p" 未绑定。

       添加   xmlns:p="http://www.springframework.org/schema/p"   如下图

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:util="http://www.springframework.org/schema/util"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/util 

http://www.springframework.org/schema/util/spring-util-4.0.xsd">

    

.......

</beans> 

收获:用属性注入时,一定要有一个无参构造器和设置set属性的方法。

用构造注入时,当存在多个构造器时,应该用index 和 value 精确定位属性值(constructor-arg 标签 里没有 name 属性



返回列表 返回列表
评论

    分享到