Spring4.1.4 构造方法constructor-arg

这里我们定义一个bean,里面有两个属性name和number。

  本文来自www.itxxz.com

  1. package com.itxxz.user.bean;  
  2.   
  3. public class Sport {  
  4.       
  5.     private String name;  
  6.       
  7.     private int number;  
  8.   
  9. }  
  

然后配置applicationContext.xml,这里通过两种方式进行赋值,一个是通过value属性,一个是通过value标签

  1. <!-- 体育运动1 -->  
  2. <bean id="sport1" class="com.itxxz.user.bean.Sport">  
  3.     <constructor-arg value="足球"></constructor-arg>  
  4.     <constructor-arg>  
  5.         <value>11</value>  
  6.     </constructor-arg>  
  7. </bean>  


但是,如果不小心,就会报一个错:

 
Multiple annotations found at this line:
- No constructor with 2 arguments defined in class 
'com.itxxz.user.bean.Sport'


如下图:





这是由于在bean中没有两个参数的构造方法,只需要新增就可以了

  1. public Sport(String name, int number) {  
  2.     super();  
  3.     this.name = name;  
  4.     this.number = number;  
  5. }


在加载bean的时候我们既可以通过bean的id,也可以通过类加载,就像下方代码:

  1. public static void main(String[] args) {  
  2.     ApplicationContext act = new ClassPathXmlApplicationContext(  
  3.             "applicationContext.xml");  
  4.     Sport s1 = act.getBean(Sport.class);  
  5.     System.out.println(s1);  
  6.   
  7. }  


运行结果:





通过上述代码及结果可以看出,通过类加载,不需要类型强转,但是也有一个弊端。

如果在xml文件中再定义一个id为sport2的bean配置,则会因为加载的类相同,导致spring无法判断加载那一个而报错,


Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.itxxz.user.bean.Sport] is defined: expected single matching bean but found 2: sport2,sport1
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:365)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
at com.itxxz.test.HelloWorld.main(HelloWorld.java:20)
IT学习者(www.itxxz.com)  

所以应用时建议通过bean来加载。

Sport sport1 = (Sport)act.getBean("sport1");


通过上述代码可知,spring可以实现构造参数的赋值。但是,bean中赋值的字段对应的是不是javabean中的属性呢?

我们在Sprot中添加如下两个个setter方法,如下:



  1. private String name;  
  2.   
  3. private int number;  
  4.   
  5. public void setName(String name) {  
  6.     this.name = name;  
  7. }  
  8.   
  9. public void setNumber2(int num) {  
  10.     this.number = num;  
  11. }


在bean配置文件中新增

  1. <bean id = "sport2" class="com.itxxz.user.bean.Sport">  
  2.     <property name="name" value="篮球"></property>  
  3.     <property name="number2" value="4"></property>  
  4. </bean>  





从结果可以看到,name和number都被赋了值。

对于name赋值是意料之中,可是怎么通过number2的setter给number赋值了呢?

这是由于bean中的property属性对应的是setter中的字段,如果是setAge,那么property的name为age,如果是setTime,name为time,这就是spring的反射机制。

http://www.itxxz.com/a/gaoji/2015/0127/spring_constructor_arg.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值