1. 程式人生 > >spring DI(Dependency Injection)彙總

spring DI(Dependency Injection)彙總

DI是如何實現的呢? Java 1.3之後一個重要特徵是反射(reflection),它允許程式在執行的時候動態的生成物件、執行物件的方法、改變物件的屬性,spring就是通過反射來實現注入的。

bean注入:

Bean注入的方式有兩種,一種是在XML中配置,此時分別有屬性注入、建構函式注入和工廠方法注入;另一種則是使用註解的方式注入 

一,spring依賴注入四種方式:

  1. 屬性注入(即通過setXxx()方法注入Bean的屬性值或依賴物件,由於屬性注入方式具有可選擇性和靈活性高的優點,因此屬性注入是實際應用中最常採用的注入方式)
  2. 建構函式注入(使用建構函式注入的前提是Bean必須提供帶引數的建構函式)
  3. 工廠方式注入(分為:1.非靜態工廠方法 必須例項化工廠類後才能呼叫工廠 ,工廠類負責建立一個或多個目標類例項,工廠類方法一般以介面或抽象類變數的形式返回目標類例項,工廠類對外遮蔽了目標類的例項化步驟,呼叫者甚至不用知道具體的目標類是什麼  2.靜態工廠方法  使用者在無須建立工廠類例項的情況下就可以呼叫工廠類方法,因此,靜態工廠方法比非靜態工廠方法的呼叫更加方便)
  4. 目前使用最廣泛的 @Autowired:自動裝配

<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">
    <!-- 
    模擬spring執行過程
        建立service例項:BookService bookService = new BookServiceImpl() IoC  <bean>
        建立dao例項:BookDao bookDao = new BookDaoImpl()         IoC
        將dao設定給service:bookService.setBookDao(bookDao);     DI   <property>

        <property> 用於進行屬性注入
            name: bean的屬性名,通過setter方法獲得
                setBookDao ##> BookDao  ##> bookDao
            ref :另一個bean的id值的引用
     -->

    <!-- 建立service -->
    <bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">
        <property name="bookDao" ref="bookDaoId"></property>
    </bean>

    <!-- 建立dao例項 -->
    <bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl"></bean>
</beans>

 

靜態工廠方式注入

單例模式(設計模式)

public class DBUtil {
    //構造方法私有化
    private DBUtil(){}
    //建立一個物件例項
    private static DBUtil instance = new DBUtil();  //若沒有static,則不能返回,為什麼?
 
    //獲取物件
    public static DBUtil getInstance(){
        return instance;
    }
    public void test(){
        System.out.println("呼叫DBUtil的test方法");
    }

在spring配置檔案加入以下程式碼

    <!--工廠方法注入-->

  <bean id="dbUtils" class="com.etc.utils.DBUtil" factory-method="getInstance"></bean>

 

二, 使用註解的方式自動注入

  需要先在Spring配置檔案加入掃描

<!-- 配置元件掃描器 就是說明你的bean註解在哪個包下 -->

<context:component-scan base-package="com.cn.*"></context:component-scan>

通過@Autowired或@Resource來實現在Bean中自動注入的功能