Spring两种注入方式解析

Spring设置注入与构造器注入

  

1、Spring框架简介(摘自百度百科)

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
2、这里介绍一下spring的liang两种注入方式

            I 设置输入方式

            例如通过xml文件配置方式配置beans

<?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="me.timlong.spring.service.impl.InjectionServiceImpl">
        <property name="injectionDAO" ref="injectionDAO"></property> 
  </bean>
  
  <bean id="injectionDAO" class="me.timlong.spring.dao.impl.InjectionDAOImpl"></bean>
</beans>


IInjectionDAOImpl.java代码:

package me.timlong.spring.dao.impl;

import me.timlong.spring.dao.IInjectionDAO;

public class InjectionDAOImpl implements IInjectionDAO {

	@Override
	public void save(String arg) {
		//模拟数据库保存操作
		System.out.println("保存数据: " + arg);
	}

}

InjectionServiceImpl.java代码:

package me.timlong.spring.service.impl;

import me.timlong.spring.dao.IInjectionDAO;
import me.timlong.spring.dao.impl.InjectionDAOImpl;
import me.timlong.spring.service.IInjectionService;

public class InjectionServiceImpl implements IInjectionService {

	private IInjectionDAO injectionDAO = new InjectionDAOImpl();
	
	//设值注入
	public void setinjectionDAO(IInjectionDAO idi) {
		this.injectionDAO = idi;
	}
	
	//构造器注入
	public InjectionServiceImpl(InjectionDAOImpl injectionDAO) {
		this.injectionDAO = injectionDAO;
	}

	@Override
	public void save(String arg) {
		//模拟业务操作
		System.out.println("Service接收参数:" + arg);
		arg += ":" + this.hashCode();
		
		this.injectionDAO.save(arg);
	}
}

使用JUnit4测试代码测试赋值注入:

测试类基类UnitTestBase.java代码:

package me.timlong.spring.base;

import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;

@RunWith(BlockJUnit4ClassRunner.class)
public class UnitTestBase {
	
	private ClassPathXmlApplicationContext context;
	private String springXmlPath;
	
	public UnitTestBase(String path) {
		this.springXmlPath = path;
	}
	
	@Before
	public void before() {
		if(StringUtils.isEmpty(springXmlPath)) {
			springXmlPath = "classpath*:spring-*.xml";
		}
		
		context = new ClassPathXmlApplicationContext(this.springXmlPath);
		context.start();
	}
	
	@After
	public void after() {
		context.destroy();
	}
	
	@SuppressWarnings("unchecked")
	protected <T extends Object> T getBean(String beanId) {
		return (T)context.getBean(beanId);
	}
	
	protected <T extends Object> T getBean(Class<T> clazz) {
		return this.context.getBean(clazz);
	}
}

测试类子类InjectionServiceImplTest.java代码:

package me.timlong.spring.service.impl;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

import me.timlong.spring.base.UnitTestBase;

@RunWith(BlockJUnit4ClassRunner.class)
public class InjectionServiceImplTest extends UnitTestBase{

	public InjectionServiceImplTest() {
		super("resources/spring-injection.xml");
	}

	@Test
	public void testConstructor() {//构造器中的参数名必须与类中的变量名保持一致
		InjectionServiceImpl isi = super.getBean("injectionService");
		isi.save("这是要保存的值value");
	}

}

最终运行结果:


        II 类似地,spring的构造器注入方式只需要更改些许配置文件,如下:

<?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="me.timlong.spring.service.impl.InjectionServiceImpl">
  	<constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg>
  </bean>
  
  <bean id="injectionDAO" class="me.timlong.spring.dao.impl.InjectionDAOImpl"></bean>
</beans>
    代码部分同上,最终运行结果亦同上。


3、spring的IoC,把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup),极大地方便了用户编程。


纸上得来终觉浅,绝知此事要躬行!望每一天进步一点,再见


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值