spring学习笔记二 属性配置

来源:互联网 发布:windows 虚拟机下载 编辑:程序博客网 时间:2024/06/11 04:54

一、字面值

      1.字面值:可用字符串表示的值,可以通过使用<value>元素标签进行值得注入

      2.字面值中含有特殊字符的字符串,使用<![CDATA[]]>标签进行值得注入

上代码:

Car.java

package spring;public class Car {    private String brand;    private String corp;    private int price;    private int maxSpeed;    public Car(String brand, String corp, int price, int maxSpeed) {super();this.brand = brand;this.corp = corp;this.price = price;this.maxSpeed = maxSpeed;}@Overridepublic String toString() {return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price + ", maxSpeed=" + maxSpeed + "]";}public void setPrice(int price) {this.price = price;}}

applicationcontext.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">    <bean id="helloworld" class="spring.HelloWorld">    <property name="name" value="diyunlong"></property>    </bean>    <!--通过构造器来配置-->    <bean id="car" class="spring.Car">       <constructor-arg value="Audi"></constructor-arg>       <constructor-arg>          <value><![CDATA[<shanghai^>]]></value>//这里的 <shanghai^> 为特殊字符,如果想要完整输出字符串,必须将字符串包裹在<![CDATA[]]>中       </constructor-arg>       <constructor-arg value="300000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>    </bean></beans>
Main.java

package spring;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {// TODO Auto-generated method stub//        1.创建spring的IOC容器对象      ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationcontext.xml");//   2.从IOC容器中获取bean实例  HelloWorld helloWorld=(HelloWorld)ctx.getBean("helloworld");                        Car car= (Car) ctx.getBean("car");          System.out.println(car);                 }}

运行结果:

Car [brand=Audi, corp=<shanghai^>, price=300000, maxSpeed=240]

二、引用其他bean

在应用程序中,一个bean往往要与其他的bean相互协作才可以完成功能,要使bean能够相互访问,就必须要在配置文件中指定bean的引用。

       1、在bean配置文件中,通过<ref>元素或者是ref属性或构造器参数对bean引用

        2、也可以申明一个内部bean,

上代码:

新建一个person.java

package spring;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;}@Overridepublic String toString() {return "person [name=" + name + ", age=" + age + ", car=" + car + "]";}   }

Car.java

package spring;public class Car {    private String brand;    private String corp;    private int price;    private int maxSpeed;    public Car(String brand, String corp, int price, int maxSpeed) {super();this.brand = brand;this.corp = corp;this.price = price;this.maxSpeed = maxSpeed;}@Overridepublic String toString() {return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price + ", maxSpeed=" + maxSpeed + "]";}public void setPrice(int price) { //如果采用级联属性配置时,没有set方法就会报错  this.price = price;}}


applicationcontex.java

<?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">    <bean id="helloworld" class="spring.HelloWorld">    <property name="name" value="diyunlong"></property>    </bean>    <!--通过构造器来配置-->    <bean id="car" class="spring.Car">       <constructor-arg value="Audi"></constructor-arg>       <constructor-arg>          <value><![CDATA[<shanghai^>]]></value>       </constructor-arg>       <constructor-arg value="300000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>    </bean>    <bean id="person" class="spring.person">       <property name="name" value="Tom"></property>       <property name="age" value="24"></property>       <property name="car" ref="car"></property>       <property name="car.price" value="30"></property>    </bean> </beans>
Main.java

package spring;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {// TODO Auto-generated method stub//        1.创建spring的IOC容器对象      ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationcontext.xml");//   2.从IOC容器中获取bean实例  HelloWorld helloWorld=(HelloWorld)ctx.getBean("helloworld");//   3.调用hello方法         /* System.out.println(helloWorld);*/                    Car car= (Car) ctx.getBean("car");          System.out.println(car);                    person person=(spring.person) ctx.getBean("person");          System.out.println(person);}}

运行结果:


Car [brand=Audi, corp=<shanghai^>, price=30, maxSpeed=240]
person [name=Tom, age=24, car=Car [brand=Audi, corp=<shanghai^>, price=30, maxSpeed=240]]


定义一个内部bean:

<bean id="person" class="spring.person">       <property name="name" value="Tom"></property>       <property name="age" value="24"></property>       <property name="car">           <bean class="spring.Car">               <constructor-arg value="Audi"></constructor-arg>       <constructor-arg>          <value><![CDATA[<shanghai^>]]></value>       </constructor-arg>       <constructor-arg value="300000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>           </bean>       </property>       <property name="car.price" value="30"></property></bean> 


三、null值和级联属性

    可以使用专用的<null/>标签对bean字符串或其他类型属性进行赋空值。

例如

<bean id="person" class="spring.person">       <property name="name" value="Tom"></property>       <property name="age" value="24"></property>       <property name="car">           <bean class="spring.Car">               <constructor-arg><null/></constructor-arg>       <constructor-arg>          <value><![CDATA[<shanghai^>]]></value>       </constructor-arg>       <constructor-arg value="300000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>           </bean>       </property>       <property name="car.price" value="30"></property>    </bean> 

spring也支持级联属性的配置

<bean id="person" class="spring.person">       <property name="name" value="Tom"></property>       <property name="age" value="24"></property>       <property name="car">           <bean class="spring.Car">               <constructor-arg><null/></constructor-arg>       <constructor-arg>          <value><![CDATA[<shanghai^>]]></value>       </constructor-arg>       <constructor-arg value="300000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>           </bean>       </property>       <property name="car.price" value="30"></property>    </bean> 

如果采用级联属性,price必须有set方法,否则就会报错


四、集合属性

1、使用<list>来配置集合属性

一个人可以有多辆车,所以Person中的car是一个集合,更改后的person.java为:

person.java

package spring;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;}@Overridepublic String toString() {return "person [name=" + name + ", age=" + age + ", cars=" + cars + "]";}   }

现在有两辆车,car和car1,更改后的applicationcontext.xml为:

applicationcontext.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">    <bean id="helloworld" class="spring.HelloWorld">    <property name="name" value="diyunlong"></property>    </bean>    <!--通过构造器来配置-->    <bean id="car" class="spring.Car">       <constructor-arg value="Audi"></constructor-arg>       <constructor-arg>          <value><![CDATA[<shanghai^>]]></value>       </constructor-arg>       <constructor-arg value="300000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>    </bean>    <bean id="car2" class="spring.Car">       <constructor-arg value="Dazhong"></constructor-arg>       <constructor-arg>          <value><![CDATA[<anhui^>]]></value>       </constructor-arg>       <constructor-arg value="500000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>    </bean>    <bean id="person" class="spring.person">       <property name="name" value="Tom"></property>       <property name="age" value="24"></property>       <property name="cars">          <list>              <ref bean="car"></ref>  //引用car              <ref bean="car2"></ref> //引用car1           </list>       </property>    </bean> </beans>





2.使用map配置集合属性

person.java






package spring;import java.util.List;import java.util.Map;public class person {   private String name;   private int age;      private Map<String, Car> cars;   private Map<String, String> imfor;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 Map<String, Car> getCars() {return cars;}public void setCars(Map<String, Car> cars) {this.cars = cars;}public Map<String, String> getImfor() {return imfor;}public void setImfor(Map<String, String> imfor) {this.imfor = imfor;}@Overridepublic String toString() {return "person [name=" + name + ", age=" + age + ", cars=" + cars + ", imfor=" + imfor + "]";}      }

applicationcontext.java

<?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">    <bean id="helloworld" class="spring.HelloWorld">    <property name="name" value="diyunlong"></property>    </bean>    <!--通过构造器来配置-->    <bean id="car" class="spring.Car">       <constructor-arg value="Audi"></constructor-arg>       <constructor-arg>          <value><![CDATA[<shanghai^>]]></value>       </constructor-arg>       <constructor-arg value="300000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>    </bean>    <bean id="car2" class="spring.Car">       <constructor-arg value="Dazhong"></constructor-arg>       <constructor-arg>          <value><![CDATA[<anhui^>]]></value>       </constructor-arg>       <constructor-arg value="500000"></constructor-arg>       <constructor-arg value="240"></constructor-arg>    </bean>    <bean id="person" class="spring.person">       <property name="name" value="Tom"></property>       <property name="age" value="24"></property>       <property name="cars">         <map>            <entry key="wode" value-ref="car"></entry>            <entry key="wode2" value-ref="car2"></entry>         </map>       </property>       <property name="imfor">           <props>               <prop key="user">diyunlong</prop>               <prop key="password">123</prop>           </props>       </property>    </bean> </beans>



从上面的配置来看有一个缺点:当我们配置多个bean时,都需要一个相同的集合,那么配置起来就会产生冗余的代码,那么我们可以将集合单独配置。
首先:




从上面的配置来看有一个缺点:当我们配置多个bean时,都需要一个相同的集合,那么配置起来就会产生冗余的代码,那么我们可以将集合单独配置。

首先:

更改好配置以后就可以改写集合了:

    <util:map id="cars">         <entry key="wode" value-ref="car"></entry>         <entry key="wode2" value-ref="car2"></entry>    </util:map>    <bean id="person" class="spring.person">       <property name="name" value="Tom"></property>       <property name="age" value="24"></property>       <property name="cars" ref="cars">       </property>       <property name="imfor">           <props>               <prop key="user">diyunlong</prop>               <prop key="password">123</prop>           </props>       </property>


五、使用p命名空间为了简化xml文件配置,越来越多的xml文件采用属性而非子元素配置信息。 Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。首先按照上面的方法将p命名空间导入

导入p命名空间之后,改写bean:

 <bean id="person1" class="spring.person" p:age="30" p:name="diyunlong" p:cars-ref="cars"></bean> 

 
原创粉丝点击