所谓注入,说白了就是如何赋值。因为spring框架中是控制反转的,你没有办法new对象,也就没有办法传参数,那么spring它是如何知道你想传的参数呢?这就是注入研究的问题。
利用私有属性的setter方法完成。
其实比较好理解,像前一篇博客我写到的
本质上就是属性注入。给id=user的这个对象的属性name完成一个赋值,这不就是一个注入吗?所以虽然注入这个词听起来高大上不好理解,但实际上就这么简单。
现在体会一下当属性为对象类型时候的注入:
很明显,我的InjectionServiceImpl类中有另一个类InjectionDao的对象,这个时候如何完成属性注入呢?
我们先简单写下Service和dao的代码,模拟一个数据存储过程。
InjectionDao接口:
package com.wm103.injection;
public interface InjectionDao {
public void save(String daoArgs);
}
它的实现类:
package com.wm103.injection;
public class InjectionDaoImpl implements InjectionDao{
@Override
public void save(String daoArgs) {
//模拟数据存入数据库的过程
System.out.println("成功存储:" + daoArgs);
}
}
InjectionService接口:
package com.wm103.injection;
public interface InjectionService {
public void save(String args);
}
它的实现类:
package com.wm103.injection;
public class InjectionServiceImpl implements InjectionService{
private InjectionDao injectionDao;
public void setInjectionDao(InjectionDao injectionDao) {
this.injectionDao = injectionDao;
}
@Override
public void save(String args) {
//模拟业务逻辑的操作
String res = args + "准备就绪";
injectionDao.save(res);
}
}
简单说一下我要做的事。
等下我要利用spring框架得到一个InjectionService的对象,让它调用自己的save方法,其中args + "准备就绪"
就是模拟一个业务逻辑的处理;然后在其save方法中我又调用了其私有对象injectionDao的save方法,完成最终存储到数据库的目的。现在,我将参数args = "NBA球星的name"
;如果最后输出成功存储:NBA球星的name准备就绪
就说明数据模拟存进了数据库
好,我们先配置applicationContext.xml文件,这是最关键的一步:
上面部分不用看,核心部分就是bean标签。
表明,我的injectionService对象的私有属性变量injectionDao的赋值是引用自一个InjectionDaoImpl的对象。
仔细分析下这句话,这里两个injectionDao是完全不同的意思。ref表示引用
最后编写测试方法运行得到结果:
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.wm103.injection.InjectionService;
import com.wm103.injection.InjectionServiceImpl;
public class TestInjection {
@Test
public void test() {
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext.xml");
InjectionService is = (InjectionService) cpx.getBean("injectionService");
is.save("NBA球星的name");
}
}
了解属性注入之后,构造注入应该也没什么问题了。
它是利用构造方法完成的
InjectionServiceImpl改成如下代码:
package com.wm103.injection;
public class InjectionServiceImpl implements InjectionService{
private InjectionDao injectionDao;
/**
* 构造器注入
*/
public InjectionServiceImpl(InjectionDao injectionDao) {
this.injectionDao = injectionDao;
}
@Override
public void save(String args) {
//模拟业务逻辑的操作
String res = args + "准备就绪";
injectionDao.save(res);
}
}
对applicationContext.xml的配置文件进行修改:
核心就是constructor那一个标签,就是利用构造函数传参进行构造了。
测试方法不用改,直接运行:
结果同上即正确!
不要被陌生的名词所吓倒,其实本质很简单。