spring的两种注入方式:属性注入、构造注入

所谓注入,说白了就是如何赋值。因为spring框架中是控制反转的,你没有办法new对象,也就没有办法传参数,那么spring它是如何知道你想传的参数呢?这就是注入研究的问题。

属性注入

利用私有属性的setter方法完成。
其实比较好理解,像前一篇博客我写到的

	
    
    

本质上就是属性注入。给id=user的这个对象的属性name完成一个赋值,这不就是一个注入吗?所以虽然注入这个词听起来高大上不好理解,但实际上就这么简单。

现在体会一下当属性为对象类型时候的注入:
spring的两种注入方式:属性注入、构造注入_第1张图片
在这里插入图片描述
很明显,我的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");
	}
}

spring的两种注入方式:属性注入、构造注入_第2张图片


构造注入

了解属性注入之后,构造注入应该也没什么问题了。
它是利用构造方法完成的
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那一个标签,就是利用构造函数传参进行构造了。

测试方法不用改,直接运行:
结果同上即正确!

不要被陌生的名词所吓倒,其实本质很简单。

你可能感兴趣的:(Spring)