在这个类中,有两个重载的构造函数,他们都有三个参数,在这种情况下使用type和index的方法都不能完成要求,这时候就需要他们两个属性同时使用了。
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
<!-- 配置对象 -->
<bean>
<constructor-arg index="0" type="String">
<value>Kevin</value>
</constructor-arg>
<constructor-arg index="1" type="String">
<value>China</value>
</constructor-arg>
<constructor-arg index="2" type="int">
<value>20</value>
</constructor-arg>
</bean>
</beans>
可以看到其实重点在于第三个入参的类型,所以我们在配置文件中指定了索引和类型,这样便可以使得Spring知道对哪个构造函数进行参数注入了。
Tips:加入我们得配置文件中存在歧义问题,Spring容器是可以正常启动的,并不会报错,它将随机采用一个匹配的构造函数实例化bean。而随机选择的构造函数可能并不是用户所需要的,所以我们在编程时要小心避免出现这种歧义情况。
【通过自身类型反射匹配入参】
如果bean构造函数入参的类型是可辨别的,由于java反射机制可以获取构造函数入参的类型,即使构造函数的注入不提供类型和索引的信息,Spring依旧可以完成构造函数信息的注入。例如下面实例中Manager类的构造函数的入参类型就是可以辨别的。
编写Manager类:
package com.Kevin.bean;
/**
* 编写Bean测试通过自身类型反射匹配入参方式
* @author Kevin
*
*/
public class Manager {
private String name;
private Double salary;
private Person person;
public Manager(String name, Double salary, Person person) {
super();
this.name = name;
this.salary = salary;
this.person = person;
}
}
编写配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
<!-- 配置对象 -->
<bean>
<constructor-arg>
<value>Kevin</value>
</constructor-arg>
<constructor-arg>
<ref bean="user"/>
</constructor-arg>
<constructor-arg>
<ref bean="person"/>
</constructor-arg>
</bean>
</beans>
以上几种方法都可以实现构造函数参数的注入,但是为了避免问题的发生,还是建议使用显式的index和type来配置构造函数的入参信息。
3.工厂方法注入
工厂方法是应用中被经常使用的设计模式,也是控制反转和单实例设计思想的主要实现方法。工厂类负责创建一个或多个工厂类实例,工厂类方法一般以接口或抽象类变量的形式返回目标类实例。
工厂类对外屏蔽了目标类的实例化步骤,调用者甚至根本不用指定具体的目标类是什么。由于Spring容器以框架的方法提供工厂方法的功能,并以透明的方式开放给开发者。因此很少需要手工编写工程方法。但在一些遗留系统或第三方类库中还是会碰到工程方法,此时便可以使用Spring工厂注入的方法来进行Spring的注入。
Spring工厂注入的方法可以分为静态和非静态两种。
【非静态工厂方法】
有些工厂方法是非静态的,必须实例化工厂类之后才能调用工厂方法。下面通过一个实例来演示。
编写工厂类:
package com.Kevin.factorybean;
/**
* 编写工厂类测试非静态工厂方法注入
* @author Kevin
*
*/