spring 依賴注入
阿新 • • 發佈:2018-12-15
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();
}
}