免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9855 | 回复: 2
打印 上一主题 下一主题

Spring构造器注入 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-04 16:47 |只看该作者 |倒序浏览
Spring构造器注入







(转自:http://javasight.net/2011/05/spring-contructor-inject-example/









在本示例中你将学到如何通过构造器注入来设置bean的属性。考虑如下的User bean类。



package net.javasight.designpattern.spring;

  1. public class User {
  2.         private String name;
  3.         private int age;
  4.         private String country;

  5.         User(String name, int age, String country) {
  6.                 this.name = name;
  7.                 this.age = age;
  8.                 this.country = country;
  9.         }

  10.         public String toString() {
  11.                 return name + " is " + age + " years old, living in " + country;
  12.         }
  13. }
复制代码
User类有三个属性:name, age,country。所有的三个属性是通过构造器注入来设置。User的toString()方法覆盖来展示用户对象信息。

下面是beans.xml你勇于Spring的配置。下面的代码展示了如何通过构造器来设置属性值。
  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"
  4.         xsi:schemaLocation="http://www.springframework.org/schema/beans
  5.                                                 http://www.springframework.org/schema/beans/spring-beans.xsd">
  6.         <bean id="user" class="net.javasight.designpattern.spring.User">
  7.                 <constructor-arg value="Eswar" />
  8.                 <constructor-arg value="24" />
  9.                 <constructor-arg value="India" />
  10.         </bean>
  11. </beans>
复制代码
bean中的constructor-arg元素用于通过构造器注入来设置属性。因为User类中只有一个构造器,所以该代码没有任何问题。当有相同个数的构造方法时,将会出现冲突。考虑如下代码:
  1.        User(int age, String country) {
  2.                 this.age = age;
  3.                 this.country = country;
  4.         }

  5.         User(String name, String country) {
  6.                 this.name = name;
  7.                 this.country = country;
  8.         }
复制代码
下面是配置文件。
  1.         <bean id="user" class="net.javasight.designpattern.spring.User">
  2.                 <constructor-arg value="24" />
  3.                 <constructor-arg value="India" />
  4.         </bean>
复制代码
那么现在你认为哪个构造器将被调用?第一个带有int和String参数的,是吧?但是你将惊讶于Spring将调用第二个构造方法。即使我们知道第一个参数是int第二个参数是String,spring将其都解析为String。要避免该冲突,你需要定义constructor-arg的 type 属性。现在如下配置,第一个构造方法将被调用。
  1.         <bean id="user" class="net.javasight.designpattern.spring.User">
  2.                 <constructor-arg type="int" value="24" />
  3.                 <constructor-arg type="java.lang.String" value="India" />
  4.         </bean>
复制代码
那么现在考虑如下情况。我们在User类中有如下的构造方法
  1.      User(String name, int age) {
  2.                 this.name = name;
  3.                 this.age = age;
  4.         }

  5.         User(int age, String country) {
  6.                 this.age = age;
  7.                 this.country = country;
  8.         }
复制代码
配置文件如下.
  1. <bean id="user" class="net.javasight.designpattern.spring.User">
  2.         <constructor-arg type="int" value="24" />
  3.         <constructor-arg type="java.lang.String" value="India" />
  4. </bean>
复制代码
那么现在你认为哪个构造方法将被调用?第二个,是吗?但是你将又一次吃惊,这是因为在调用构造方法配置文件中定义的参数顺序不做考虑。要解决该问题,需要指定index。

下面是增加了index属性的配置文件:
  1. <bean id="user" class="net.javasight.designpattern.spring.User">
  2.         <constructor-arg index="0" type="int" value="24" />
  3.         <constructor-arg index="1" type="java.lang.String"
  4.                 value="India" />
  5. </bean>
复制代码
现在,如我们所期待的,第二个构造方法将被调用.

论坛徽章:
0
2 [报告]
发表于 2012-01-04 16:47 |只看该作者
谢谢分享

论坛徽章:
8
数据库技术版块每日发帖之星
日期:2015-12-22 06:20:00平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2016-01-21 06:20:00IT运维版块每日发帖之星
日期:2016-02-03 06:20:00技术图书徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34shanzhi
日期:2016-06-17 17:59:31JAVA
日期:2016-10-25 16:16:28
3 [报告]
发表于 2016-02-03 17:32 |只看该作者
不错的东西。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP