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

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

属性注入

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

	<bean id="user" class="com.wm103.ioc.User">
    <property name="name" value="LeBronJames"></property>
    </bean>

本质上就是属性注入。给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文件,这是最关键的一步:

<?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="injectionService" class="com.wm103.injection.InjectionServiceImpl">
    <property name="injectionDao" ref="injectionDao"></property>
    </bean>
    <bean id="injectionDao" class="com.wm103.injection.InjectionDaoImpl"></bean>
</beans>

上面部分不用看,核心部分就是bean标签。
表明,我的injectionService对象的私有属性变量injectionDao的赋值是引用自一个InjectionDaoImpl的对象。
仔细分析下这句话,这里两个injectionDao是完全不同的意思。ref表示引用

<property name="injectionDao" ref="injectionDao"></property>

最后编写测试方法运行得到结果:

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的配置文件进行修改:

<?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="injectionService" class="com.wm103.injection.InjectionServiceImpl">
    <constructor-arg name="injectionDao" ref="injectionDao"></constructor-arg>
    </bean>
    
    <bean id="injectionDao" class="com.wm103.injection.InjectionDaoImpl"></bean>
</beans>

核心就是constructor那一个标签,就是利用构造函数传参进行构造了。

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值