spring构造函数注入

在这个例子中我们将通过构造函数注入设置bean属性。先看一下下面的User bean类。

 

 

  1. package com.vaannila;   
  2.      
  3. public class User {   
  4.      
  5.     private String name;    
  6.     private int age;     
  7.     private String country;   
  8.     
  9.     User(String name, int age, String country)   
  10.     {         
  11.         this.name=name;         
  12.         this.age=age;           
  13.         this.country=country;   
  14.     }   
  15.      
  16.     public String toString() {         
  17.         return name + " is " + age + " years old, living in " + country;      
  18.     }   
  19. }  

package com.vaannila; public class User { private String name; private int age; private String country; User(String name, int age, String country) { this.name=name; this.age=age; this.country=country; } public String toString() { return name + " is " + age + " years old, living in " + country; } }

 

 

User bean类有三个属性,即:name, age和country。这三个属性都是通过setter注入来进行设置的。User bean类的toString()方法被重载来展示User对象。

 

bean.xml用来配置spring bean。下面的代码说明设置属性的值直至setter注入。

 

 

  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3. 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">   
  4.     
  5.     <bean id="user" class="com.vaannila.User" >         
  6.         <constructor-arg value="Eswar" />         
  7.         <constructor-arg value="24"/>        
  8.         <constructor-arg value="India"/>     
  9.     </bean>   
  10.   
  11. </beans>  

<?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="user" class="com.vaannila.User" > <constructor-arg value="Eswar" /> <constructor-arg value="24"/> <constructor-arg value="India"/> </bean> </beans>

 

 

在bean元素中的constructor-arg元素用来设置属性值直至构造函数注入。当User bean类中有一个构造函数,这个代码将会正常工作。当有另外一个有相同参数数量的构造函数,将会产生错误,参考一下代码:

 

 

  1. User( int age, String country)   
  2. {    
  3.     this.age=age;     
  4.     this.country=country;   
  5. }   
  6.   
  7. User(String name, String country)   
  8. {   
  9.      
  10.     this.name=name;      
  11.     this.country=country;   
  12. }  

User( int age, String country) { this.age=age; this.country=country; } User(String name, String country) { this.name=name; this.country=country; }

 

 

bean的配置文件:

 

  1. <bean id="user" class="com.vaannila.User" >      
  2.     <constructor-arg value="24"/>      
  3.     <constructor-arg value="India"/>   
  4. </bean>  

<bean id="user" class="com.vaannila.User" > <constructor-arg value="24"/> <constructor-arg value="India"/> </bean>

 

 

现在哪个构造函数将被调用?调用第一个int和String参数的构造函数是正确的,但是事实上将调用第二个构造函数。虽然我们知道第一个参数是int类型,第二个参数是String类型,但是Spring将他们都解释为Spring参数。为了避免这种情况,需要指定constructor-arg元素的type属性。现在bean配置属性如下,第一个构造函数将被调用。

 

 

  1. <bean id="user" class="com.vaannila.User" >    
  2.     <constructor-arg type="int" value="24"/>   
  3.     <constructor-arg type="java.lang.String" value="India"/>   
  4. </bean>  

<bean id="user" class="com.vaannila.User" > <constructor-arg type="int" value="24"/> <constructor-arg type="java.lang.String" value="India"/> </bean>

 

 

我们将User bean类的构造函数改为如下的情况:

 

  1. User(String name, int age)   
  2. {       
  3.     this.name=name;      
  4.     this.age=age;   
  5. }   
  6.    
  7. User( int age, String country)   
  8. {   
  9.     this.age=age;      
  10.     this.country=country;   
  11. }  

User(String name, int age) { this.name=name; this.age=age; } User( int age, String country) { this.age=age; this.country=country; }

 

 

现在哪个构造函数将被调用那?调用第二个构造函数是正确的,但是实际情况是第一个构造函数被调用。这是因为当构造函数被调用的时候,在bean配置文件不会考虑参数出现的顺序。为了解决这个问题我们可以指定构造函数参数的索引数。

bean配置文件如下:

 

  1. <bean id="user" class="com.vaannila.User" >     
  2.     <constructor-arg index="0" type="int" value="24"/>     
  3.     <constructor-arg index="1" type="java.lang.String" value="India"/>   
  4. </bean>  

<bean id="user" class="com.vaannila.User" > <constructor-arg index="0" type="int" value="24"/> <constructor-arg index="1" type="java.lang.String" value="India"/> </bean>

 

 

现在,现在正确的构造函数将被调用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值