Spring 在不使用自动装配的方式进行注入需要我们必须为成员属性提供setter方法,这种方式相对比较繁琐,除了setter方法注入方式外,Spring还为我们提供了构造器配置的注入方式。
构造器默认注入方式
接下来开始演示我们的构造器默认注入方式操作:
- 创建用户类为其提供名称为name和age的成员属性(无需提供get set方法)
具体代码如下:
package cn.zhuoqianmingyue.ioc.di.constructor;
public class User {
private String name;
private Integer age;
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public void showUserInfo() {
System.out.println("name:"+name+" age:"+age);
}
}
- 通过 constructor-arg 标签value属性设置要注入的值。
具体配置信息如下:
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd ">
<bean id="userDefault" class="cn.zhuoqianmingyue.ioc.di.constructor.User">
<constructor-arg value="zhouqianmingyue"/>
<constructor-arg value="16"/>
</bean>
</beans>
需要注意的是这里的标签的顺序要和构造方法中的参数顺序一致
添加测试类进行测试:
public class UserPropertyDITest {
private static Logger log = LoggerFactory.getLogger(UserPropertyDITest.class);
@Test
public void userDefault() {
ApplicationContext appliction = new ClassPathXmlApplicationContext("ioc-di-constructor.xml");
User user = (User)appliction.getBean("userDefault");
user.showUserInfo();
}
}
测试结果:
构造器参数指定角标方式
我们可以通过constructor-arg标签的index属性来指定参数的交标,这样设置我们就无需考虑配置顺序问题:
具体代码如下:
<bean id="userIndex" class="cn.zhuoqianmingyue.ioc.di.constructor.User">
<constructor-arg index="1" value="30"/>
<constructor-arg index="0" value="zhouqianmingyue"/>
</bean>
进行测试:
@Test
public void userIndex() {
ApplicationContext appliction = new ClassPathXmlApplicationContext("ioc-di-constructor.xml");
User user = (User)appliction.getBean("userIndex");
user.showUserInfo();
}
测试结果:
构造器参数指定类型方式
Spring也为我们提供了通过参数的类型来指定具体为那个成员属性进行值的注入,具体操作时通过constructor-arg标签的type属性进行参数类型的设定。
具体代码如下:
<bean id="userType" class="cn.zhuoqianmingyue.ioc.di.constructor.User">
<constructor-arg type="java.lang.Integer" value="30"/>
<constructor-arg type="java.lang.String" value="zhouqianmingyue"/>
</bean>
进行测试:
@Test
public void userType() {
ApplicationContext appliction = new ClassPathXmlApplicationContext("ioc-di-constructor.xml");
User user = (User)appliction.getBean("userType");
user.showUserInfo();
}
测试结果:
构造器引用类型注入
如果说我们的构造器中有引用类型 那么我们可以通过constructor-arg标签的ref 属性来设置我们要引入的Bean。具体配置代码如下:
<bean id="userHasClass" class="cn.zhuoqianmingyue.ioc.di.constructor.User">
<constructor-arg type="java.lang.Integer" value="30"/>
<constructor-arg type="java.lang.String" value="zhouqianmingyue"/>
<constructor-arg type="cn.zhuoqianmingyue.ioc.di.constructor.Country" ref="country"/>
</bean>
<bean id="country" class="cn.zhuoqianmingyue.ioc.di.constructor.Country">
<property name="name" value="CHINA"/>
</bean>
Country具体代码如下:
package cn.zhuoqianmingyue.ioc.di.constructor;
public class Country {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
进行测试:
@Test
public void userHasClass() {
ApplicationContext appliction = new ClassPathXmlApplicationContext("ioc-di-constructor.xml");
User user = (User)appliction.getBean("userHasClass");
user.showUserInfoHasCountry();
}