- Spring注入是指在启动Spring容器加载配置的时候完成对变量的赋值行为
- 常用的两种注入方式
- 设值注入:通过一个成员变量的set方法进行设值
- 如下代码中,id 用来区分不同的bean,class的路径为对应类的路径,以包名.类名的形式,property对应着属性,在property指明在login类中存在一个User类的成员变量,ref是声明login有一个引用它指向了对应的user bean,对应着User类。 在java类中,我们通常将属性设置为private访问权限,通过set、get方法去对私有属性进行读写操作,设值注入相当于自动为我们调用set方法对属性进行赋值
<bean id="login" class="cn.xm.action.Login">
<property name="user" ref="user"/>
</bean>
<bean id="user" class="com.xm.bean.User"></bean>
- 构造注入:通过构造器的形式为成员变量赋值
- 与设值注入相比,构造注入多了<constructor-arg > 标签。在ioc容器调用Login的构造方法去创建实例的时候,会根据ref讲User的实例赋值给构造器中声明的user属性,从而完成在创建Login时候对user的赋值
<bean id="login" class="cn.xm.action.Login">
<constructor-arg name="user" ref="user"></constructor-arg>
</bean>
<bean id="user" class="com.xm.bean.User"></bean>
设值注入实例:
UserService.java:
package cn.xm.test.service;
import cn.xm.test.dao.UserDAO;
public class UserService {
private UserDAO userDAO;
public void save(String arg) {
System.out.println("Service接收参数" + arg);
arg = arg + ":" + this.hashCode();
userDAO.save(arg);
}
//设值注入
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
UserDAO.java:
package cn.xm.test.dao;
public class UserDAO {
public void save(String arg) {
//模拟数据库保存操作
System.out.println("保存数据:" + arg);
}
}
spring-injection.xml:
<?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="UserService" class="cn.xm.service.UserService">
<property name = "userDAO" ref="userDAO"></property>
</bean>
<bean id="userDAO" class="cn.xm.dao.UserDAO"></bean>
</beans>
TestInjection.java:
package cn.xm.test.ioc.interfaces;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import cn.xm.test.base.UnitTestBase;
import cn.xm.test.service.UserService;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestInjection extends UnitTestBase {
public TestInjection() {
super("classpath:spring-injection.xml");
}
@Test
public void testSetter() {
UserService service = super.getBean("UserService");
service.save("这是要保存的数据");
}
}
以上通过UserDAO模拟了存储的操作,并且在UserService中模拟了业务操作。最后用junit进行了单元测试。
构造注入的与设置注入的区别在于spring-injection.xml的配置上和UserService的构造上:
spring-injection.xml:
<?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="UserService" class="cn.xm.test.service.UserService">
<property name = "userDAO" ref="userDAO"></property>
</bean>
-->
<bean id="UserService" class="cn.xm.test.service.UserService">
<constructor-arg name = "userDAO" ref="userDAO"></constructor-arg>
</bean>
<bean id="userDAO" class="cn.xm.test.dao.UserDAO"></bean>
</beans>
UserService.java:
package cn.xm.test.service;
import cn.xm.test.dao.UserDAO;
public class UserService {
private UserDAO userDAO;
//构造注入
public UserService(UserDAO userDAO){
this.userDAO = userDAO;
}
public void save(String arg) {
System.out.println("Service接收参数" + arg);
arg = arg + ":" + this.hashCode();
userDAO.save(arg);
}
//设值注入
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}