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),極大地方便了用戶編程。


紙上得來終覺淺,絕知此事要躬行!望每一天進步一點,再見


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章