- 论坛徽章:
- 0
|
Spring构造器注入
(转自:http://javasight.net/2011/05/spring-contructor-inject-example/)
在本示例中你将学到如何通过构造器注入来设置bean的属性。考虑如下的User bean类。
package net.javasight.designpattern.spring;
- 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类有三个属性:name, age,country。所有的三个属性是通过构造器注入来设置。User的toString()方法覆盖来展示用户对象信息。
下面是beans.xml你勇于Spring的配置。下面的代码展示了如何通过构造器来设置属性值。- <?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="net.javasight.designpattern.spring.User">
- <constructor-arg value="Eswar" />
- <constructor-arg value="24" />
- <constructor-arg value="India" />
- </bean>
- </beans>
复制代码 bean中的constructor-arg元素用于通过构造器注入来设置属性。因为User类中只有一个构造器,所以该代码没有任何问题。当有相同个数的构造方法时,将会出现冲突。考虑如下代码:- User(int age, String country) {
- this.age = age;
- this.country = country;
- }
- User(String name, String country) {
- this.name = name;
- this.country = country;
- }
复制代码 下面是配置文件。- <bean id="user" class="net.javasight.designpattern.spring.User">
- <constructor-arg value="24" />
- <constructor-arg value="India" />
- </bean>
复制代码 那么现在你认为哪个构造器将被调用?第一个带有int和String参数的,是吧?但是你将惊讶于Spring将调用第二个构造方法。即使我们知道第一个参数是int第二个参数是String,spring将其都解析为String。要避免该冲突,你需要定义constructor-arg的 type 属性。现在如下配置,第一个构造方法将被调用。- <bean id="user" class="net.javasight.designpattern.spring.User">
- <constructor-arg type="int" value="24" />
- <constructor-arg type="java.lang.String" value="India" />
- </bean>
复制代码 那么现在考虑如下情况。我们在User类中有如下的构造方法- User(String name, int age) {
- this.name = name;
- this.age = age;
- }
- User(int age, String country) {
- this.age = age;
- this.country = country;
- }
复制代码 配置文件如下.- <bean id="user" class="net.javasight.designpattern.spring.User">
- <constructor-arg type="int" value="24" />
- <constructor-arg type="java.lang.String" value="India" />
- </bean>
复制代码 那么现在你认为哪个构造方法将被调用?第二个,是吗?但是你将又一次吃惊,这是因为在调用构造方法配置文件中定义的参数顺序不做考虑。要解决该问题,需要指定index。
下面是增加了index属性的配置文件:- <bean id="user" class="net.javasight.designpattern.spring.User">
- <constructor-arg index="0" type="int" value="24" />
- <constructor-arg index="1" type="java.lang.String"
- value="India" />
- </bean>
复制代码 现在,如我们所期待的,第二个构造方法将被调用.
|
|