1. 程式人生 > >spring 依賴注入

spring 依賴注入

spring實現ioc容器的方法是依賴注入,依賴注入的作用是在使用Spring框架建立物件時動態的將其所依賴的物件(例如屬性值)注入Bean元件中。

spring框架的依賴注入通常有兩種實現方式,一種是使用構造方法注入,另一種是使用屬性的setter方法注入。

使用構造方法注入

專案結構如下

1.建立dao包,並建立dao層的介面和實現類

介面TestDIDao的程式碼如下

package dao;

public interface TestDIDao {

	public void sayHello();	
}

實現類TestDIDaoImpl的程式碼如下

package dao;

public class TestDIDaoImpl implements TestDIDao {

	@Override
	public void sayHello() {
		// TODO Auto-generated method stub
		System.out.println("TestDIDao say:fdssb1313gsb4");
	}

}

2.建立service包,並建立service層的介面和實現類

介面TestDIService的程式碼如下

package service;

public interface TestDIService {
	public void sayHello();

}

實現類TestDIServiceImpl的程式碼如下

package service;

import dao.TestDIDao;

public class TestDIServiceImpl implements TestDIService {
	
	private  TestDIDao tdo;
	//構造方法,用於實現依賴注入介面物件tdo
	public TestDIServiceImpl(TestDIDao tdo) {
		super();
		this.tdo = tdo;
	}


	@Override
	public void sayHello() {
		// TODO Auto-generated method stub
		tdo.sayHello();
		System.out.println("TestDIService構造方法注入sayhello");
	}

}

3.編寫配置檔案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">

   
    
<!--    將 dao.TestDIDaoImpl託管給spring -->
    <bean id="mytestDao" class="dao.TestDIDaoImpl"></bean>
<!--     使用構造方法注入 -->
    <bean  id="testDIService" class="service.TestDIServiceImpl">
    	<!-- 將 mytestDao注入到TestDIServiceImpl類的屬性TestDIDao上 -->
        <constructor-arg  index="0" ref="mytestDao" />
    </bean>

<!-- 
constructor-arg 定義類構造方法的引數
index 定義引數的位置
ref 指定某個例項的引用,如果引數是常量值,ref由value代替



 -->
</beans>

4.建立測試包,並建立測試類

package test;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import service.TestDIService;

public class Test {

	public static void main(String[] args) {
				
		//初始化Spring容器ApplicationContext,載入配置檔案
		ApplicationContext appCon =new ClassPathXmlApplicationContext("applicationContext.xml");
				
		//通過容器獲取test例項
		TestDIService ts =(TestDIService)appCon.getBean("testDIService");
		ts.sayHello();
	}

}

5.執行結果

使用屬性的setter方法注入

使用setter方法注入是Spring框架中最主流的注入方式,對於setter方法注入,Spring框架也是使用java的反射機制實現的。

1.建立介面實現類TestDIServiceImpl2,並使用setter方法注入TestDIDao介面物件

package service;

import dao.TestDIDao;

public class TestDIServiceImpl2  implements TestDIService{

	private TestDIDao tdo;
	//使用setter方法注入TestDIDao介面物件	
	public void setTdo(TestDIDao tdo) {
		this.tdo = tdo;
	}


	@Override
	public void sayHello() {
		tdo.sayHello();
		System.out.println("testDIService2 --setter方法注入");
	}

}

2.將TestDIServiceImpl2託管給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">

   
    
<!--    將 dao.TestDIDaoImpl託管給spring -->
    <bean id="mytestDao" class="dao.TestDIDaoImpl"></bean>
    
<!--     使用構造方法注入 -->
    <bean  id="testDIService" class="service.TestDIServiceImpl">
    	<!-- 將 mytestDao注入到TestDIServiceImpl類的屬性TestDIDao上 -->
        <constructor-arg  index="0" ref="mytestDao" />
    </bean>

<!-- 
constructor-arg 定義類構造方法的引數
index 定義引數的位置
ref 指定某個例項的引用,如果引數是常量值,ref由value代替
 -->
 
 
 
    <!-- 使用setter方法注入 -->
    <bean id="testDIService2" class="service.TestDIServiceImpl2">
    	<property name="tdo"  ref="mytestDao"></property>
    	<!--
    	  name  setter方法注入的屬性
    	  ref 指定某個例項的引用
    	  -->
    </bean>
 
 
 
 
</beans>

3.測試程式碼

package test;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import service.TestDIService;

public class Test {

	public static void main(String[] args) {
				
		//初始化Spring容器ApplicationContext,載入配置檔案
		ApplicationContext appCon =new ClassPathXmlApplicationContext("applicationContext.xml");
				
		//通過容器獲取test例項
		TestDIService ts =(TestDIService)appCon.getBean("testDIService");
		ts.sayHello();
		
		TestDIService ts2 =(TestDIService)appCon.getBean("testDIService2");
		ts2.sayHello();
		
	}

}

4.執行結果