Spring支持的常用注入方式有属性注入(setter注入),构造函数器注入,工厂方法注入。
1. 属性注入(setter注入)
属性注入指通过setXXX()方法注入bean的属性值或依赖对象。具有可选性和灵活性高的特点。要求bean提供一个默认的构造函数(无参),为注入的属性提供对应的setter方法。
例:
package test;
public class User {
private String phone;
private String userName;
private String password;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [phone=" + phone + ", userName=" + userName
+ ", password=" + password + "]";
}
}
XML配置
<beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:p=“http://www.springframework.org/schema/p”
xmlns:context=“http://www.springframework.org/schema/context”
xmlns:aop=“http://www.springframework.org/schema/aop”
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
">
<bean id="user" class="test.User">
<property name="phone">
<value>12345678901</value>
</property>
<property name="userName">
<value>asd</value>
</property>
<property name="password">
<value>123</value>
</property>
</bean>
测试 package test;import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User user = (User) ctx.getBean("user");
System.out.println(user);
}
}
结果:注意:变量的前两个字母要不全部大写,要不全部小写。
2. 构造函数注入
使用构造函数注入bean必须提供带参的构造函数。
例
package test;
public class User {
private String phone;
private String userName;
private String password;
public User(String phone, String userName, String password) {
this.phone = phone;
this.userName = userName;
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [phone=" + phone + ", userName=" + userName
+ ", password=" + password + "]";
}
}
xml配置:
<bean id="user" class="test.User">
<constructor-arg index="0" type="java.lang.String">
<value>15012345678</value>
</constructor-arg>
<constructor-arg index="1" type="java.lang.String">
<value>aa</value>
</constructor-arg>
<constructor-arg index="2" type="java.lang.String">
<value>321</value>
</constructor-arg>
</bean>
注:“type”判断了配置项和构造函数入参的项是否匹配,“index” 通过入参索引的位置确定对应关系。
测试
package test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User user = (User) ctx.getBean("user");
System.out.println(user);
}
}
结果:
3. 工厂方法注入
1)静态工厂方法
package test;
//创建工厂类
public class UserFactory {
// 创建静态工厂方法
public static User getUserInfo() {
User user = new User();
user.setPhone(“98765432112”);
user.setPassword(“987”);
user.setUserName(“test”);
return user;
}
}
xml配置:
<!-- class指定工厂类-->
<bean id="user" class="test.UserFactory" factory-method="getUserInfo">
</bean>
测试:
package test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User user = (User) ctx.getBean("user");
System.out.println(user);
}
}
结果:
2) 非静态工厂方法
非静态工厂方法必须实例化工厂类后才能调用工厂类方法。
例
package test;
//创建工厂类
public class UserFactory {
// 创建非静态工厂方法
public User getUserInfo() {
User user = new User();
user.setPhone("98765432112");
user.setPassword("987");
user.setUserName("test");
return user;
}
}
xml配置
<!-- 定义工厂类bean -->
<bean id="userFactory" class="test.UserFactory"></bean>
<!-- factory-bean工厂类bean factory-method工厂类方法-->
<bean id="user" factory-bean="userFactory" factory-method="getUserInfo">
</bean>
测试:
package test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User user = (User) ctx.getBean("user");
System.out.println(user);
}
}
结果: