1. 程式人生 > >Spring系列教程五: 依賴注入的方式詳解

Spring系列教程五: 依賴注入的方式詳解

依賴注入的概念

Spring中的依賴注入,稱為dependency Injection,Ioc的作用降低程式之間的耦合,依賴關係管理交給Spring來維護,在當前類中需要用到其他類的物件,由spring為我們提供,我們只需要在配置檔案中說明,依賴關係的維護,我們稱之為依賴注入

依賴注入的三種資料

基本資料型別和String、其他bean型別(在配置檔案中或者註解配置過的bean)、複雜型別/集合型別

依賴注入的三種方式

①使用建構函式  ②使用set方法提供   ③使用複雜型別注入/集合型別注入

建構函式注入

①目錄結構,介面實現類中屬性和方法

public class AccountServiceImpl implements IAccountService {
  
   //如果是經常變化的資料,並不適用於註冊的方式
   private String name;
   private Integer age;
   private Date brithday;

   AccountServiceImpl(String name,Integer age,Date brithday){
       this.name=name;
       this.age=age;
       this.brithday=brithday;
   }

   public void saveAccount(){
       System.out.println("service中的saveAccount方法執行了...."+name+age+brithday);
   }
}

②修改配置檔案

在配置檔案中,用使用標籤constructor-arg, 標籤出現的位置bean標籤內部

標籤中屬性 type:用於指定要注入的資料的資料型別,該資料也是建構函式中某個或者某些引數的型別,不能獨立實現注入,index:用於指定注入的資料給建構函式中指定索引位置的引數賦值,索引的位置從0開始,需要記索引,name:用於給指定後遭函式中指定名稱的引數賦值(常用的)
                                     =======================以上三個用於給建構函式中引數賦值=========================

value:用於給基本型別和Strig提供資料,ref:就是引用指定其他的bean資料,它指的就是在Spring Ioc核心容器出現過的bean物件如下

<bean id="accountService" class="com.ithema.jdbc.service.impl.AccountServiceImpl">
       <constructor-arg name="name" value="name"></constructor-arg>
       <constructor-arg name="age" value="20"></constructor-arg>
       <constructor-arg name="brithday" ref="now"></constructor-arg>
</bean>
<!--配置一個日期物件-->
<bean id="now" class="java.util.Date"></bean>

③測試實現類,執行程式碼得到以下結果,成功實現了依賴注入

package com.ithema.jdbc.ui;
import org.springframework.core.io.ClassPathResource;

import javax.annotation.Resource;

public class Client {
    public static void main(String[] args) {
    ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml");
    IAccountService as= (IAccountService) ac.getBean("accountService");
    System.out.println(as);
    as.saveAccount();
}

 優勢:在獲取bean物件時候注入資料是必須的操作,否則物件無法建立成功      弊端:改變了bean物件的例項化方式,使我們在建立物件時候用不到這些資料也必須提供

set方式注入(是我們經常用的注入方式)

①在介面類中實現屬性的set的方法

package com.ithema.jdbc.service.impl;

import com.ithema.jdbc.service.IAccountService;

import java.util.Date;

/**
 * 賬戶的業務層實現類
 */
public class AccountServiceImpl2 implements IAccountService {
   //如果是經常變化的資料,並不適用於註冊的方式
    private String name;
    private Integer age;
    private Date brithday;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setBrithday(Date brithday) {
        this.brithday = brithday;
    }

   public void saveAccount(){
       System.out.println("service中的saveAccount方法執行了...."+"名字:"+name+"年紀:"+age+"生日:"+brithday);
   }
}

②配置檔案中修改程式碼

<bean id="accountService2" class="com.ithema.jdbc.service.impl.AccountServiceImpl2">
        <property name="name" value="Test"></property>
        <property name="age" value="21"></property>
        <property name="brithday" ref="now"></property>
</bean>

③測試類的執行,得到以下結果

package com.ithema.jdbc.ui;
import org.springframework.core.io.ClassPathResource;

import javax.annotation.Resource;

public class Client {
    public static void main(String[] args) {
    ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml");
    IAccountService as= (IAccountService) ac.getBean("accountService2");
    System.out.println(as);
    as.saveAccount();
}

使用set方法實現注入

優勢:建立物件沒有明確的限制,可以直接使用預設的建構函式   劣勢:如果某個成員必須有值,則獲取物件時候,set無法執行

 

複雜型別方式的注入

①介面實現類set方法

package com.ithema.jdbc.service.impl;

import com.ithema.jdbc.service.IAccountService;

import java.lang.reflect.Array;
import java.util.*;

/**
 * 賬戶的業務層實現類
 */
public class AccountServiceImpl3 implements IAccountService {
   //複雜型別注入/集合注入
    private String[] myStrs;
    private List<String> myList;
    private Map<String,String>myMap;
    private Properties myPro;

    public void setMyStrs(String[] myStrs) {
        this.myStrs = myStrs;
    }

    public void setMyList(List<String> myList) {
        this.myList = myList;
    }

    public void setMyMap(Map<String, String> myMap) {
        this.myMap = myMap;
    }

    public void setMyPro(Properties myPro) {
        this.myPro = myPro;
    }


   public void saveAccount(){
       System.out.println(Arrays.toString(myStrs));
       System.out.println(myList);
       System.out.println(myMap);
       System.out.println(myPro);
   }
}

②改變配置檔案中的程式碼



    <bean id="accountService3" class="com.ithema.jdbc.service.impl.AccountServiceImpl3">
        <property name="myStrs">
            <array>
                <value>AAAA</value>
                <value>BBBB</value>
                <value>CCC</value>
            </array>
        </property>
        <property name="myList">
            <list>
                <value>AAA</value>
                <value>BBB</value>
                <value>CCC</value>
            </list>
        </property>
        <property name="myMap">
            <map>
                <entry key="test1" value="AA"></entry>
                <entry key="test2" value="BB"></entry>
                <entry key="test3" value="CC"></entry>
            </map>
        </property>
        <property name="myPro">
            <props>
                <prop key="test2">A</prop>
                <prop key="test1">B</prop>
                <prop key="test">C</prop>
            </props>
        </property>
    </bean>

③測試類的執行,執行的結果如下

package com.ithema.jdbc.ui;
import org.springframework.core.io.ClassPathResource;

import javax.annotation.Resource;

public class Client {
    public static void main(String[] args) {
    ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml");
    IAccountService as= (IAccountService) ac.getBean("accountService3");
    System.out.println(as);
    as.saveAccount();
}

相關推薦

Spring系列教程 依賴注入方式

依賴注入的概念 Spring中的依賴注入,稱為dependency Injection,Ioc的作用降低程式之間的耦合,依賴關

Spring Boot系列教程配置文件properties

date int ava ota axu return 端口 rand work 一.配置隨機數,使用隨機數 在application.properties文件添加配置信息 1 #32位隨機數 2 woniu.secret=${random.value} 3 #隨機整數

Spring系列之六AOP的代理

Aop是面向切片的程式設計,首先先用圖解釋AOP的程式設計這是沒有用aop的情況,程式碼中存在大量的重複的程式碼:使用aop就是採用一個切片,對封裝好的程式進行切開,減少重複的程式碼,對重複的程式碼進行復用:那麼如何實現這種aop的切片程式設計了?就是使用動態代理的方式,為方

SpringDI四種依賴注入方式

文章已託管到GitHub,大家可以去GitHub檢視閱讀,歡迎老闆們前來Star!搜尋關注微信公眾號 【碼出Offer】 領取各種學習資料! LOGO SpringDI(依賴注入) 一、DI概述 Dependency Injection即為依賴注入,簡稱DI 。 簡單來說,在Spring建立物件

spring依賴注入方式

平常的java開發中,程式設計師在某個類中需要依賴其它類的方法,則通常是new一個依賴類再呼叫類例項的方法,這種開發存在的問題是new的類例項不好統一管理,spring提出了依賴注入的思想,即依賴類不由程式設計師例項化,而是通過spring容器幫我們new指定例項並且將例項注

Spring系列教程 Spring 整合mybatis的四種方式

一、使用採用資料對映器(MapperFactoryBean)的方式註解實現整合mybatis 不用寫mybatis對映檔案,採

Spring系列教程 Spring實現事務的兩種方式

一、 Spring事務概念: 事務是一系列的動作,它們綜合在一起才是一個完整的工作單元,這些動作必須全部完成,如果有一個失敗的

Spring Security教程()自定義過濾器從資料庫從獲取資源資訊

  在之前的幾篇security教程中,資源和所對應的許可權都是在xml中進行配置的,也就在http標籤中配置intercept-url,試想要是配置的物件不多,那還好,但是平常實際開發中都往往是非常多的資源和許可權對應,而且寫在配置檔案裡面寫改起來還得該原始碼配置檔案,這顯然是不好的。因此接下來

Spring的核心機制依賴注入(DI)

1 理解依賴注入   A物件需要呼叫B物件方法的情形,被Spring稱為依賴,即A物件依賴於B物件;   互相呼叫的關係稱為依賴關係;   Spring容器是一個大工廠,管理著所有java物件,這些物件被稱為Bean;   Spring容器通過一種“依賴注入”的方式來管理Bean之間的依賴關係;  

深入淺出spring IOC中三種依賴注入方式

首先:第一個問題,參與者都有誰?1)物件2)IOC/DI容器3)某個物件的外部資源第二問題:依賴,誰依賴誰?為什麼需要依賴?依賴嘛,很好理解的,物件依賴於IOC/DI容器,至於為什麼要依賴呢?物件需要IOC/DI容器來提供物件需要的外部資源。第三個問題:注入,誰注入誰?又注入了什麼呢?顯而易見是IOC/DI容

spring IOC中三種依賴注入方式 經典總結

首先:第一個問題,參與者都有誰?1)物件2)IOC/DI容器3)某個物件的外部資源第二問題:依賴,誰依賴誰?為什麼需要依賴?依賴嘛,很好理解的,物件依賴於IOC/DI容器,至於為什麼要依賴呢?物件需要IOC/DI容器來提供物件需要的外部資源。第三個問題:注入,誰注入誰?又注入了什麼呢?顯而易見是IOC/DI容

Spring的核心機制依賴注入及設值注入和構造注入的區別

Ø 理解依賴注入 在分析原理之前我們先回顧下依賴注入的概念:我們常提起的依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java例項,呼叫者)需要另一個角色(另一個Jav

Spring事務Transaction配置的注入方式

前段時間對Spring的事務配置做了比較深入的研究,在此之間對Spring的事務配置雖說也配置過,但是一直沒有一個清楚的認識。通過這次的學習發覺Spring的事務配置只要把思路理清,還是比較好掌握的。     總結如下:     Spring配置檔案中關於事務配置總是由

Spring系列教程 Spring Ioc容器

根據上一篇文章講解內容建立物件有以下兩種方式 一、主動去找資源通過例項化物件的方式,兩者之間有必然聯絡,應用獨立就變得比較難

spring 系列教程HelloWorld例項

首先引入我們需要建立一個maven專案,引入pom: <dependency> <groupId&g

Spring系列教程 Spring基於註解的Ioc以及Ioc案例

  學習基於註解的Ioc配置,我們腦海中需要有一個認知,就是註解配置和xml配置實現的功能都是一樣的,都是要降低程式間

Spring系列教程AOP詳細講解

AOP 概述 什麼是 AOP AOP:全稱是 Aspect Oriented Programming 即:面向切面程式設計

mysql系列 xtrabackup備份工具-技術流ken

[[email protected] ~]# innobackupex --copy-back /ken/2018-10-23_04-51-51/ xtrabackup: recognized server arguments: --datadir=/data/mysql/mysql3306/da

Spring IOC/BeanFactory/ApplicationContext的工作流程/實現原理/初始化/依賴注入原始碼

Spring的工作流程/實現原理之基石IOC/BeanFactory/ApplicationContext 更新1:2017/11/23更新2:2018/1/30(截圖)一、什麼是IOC容器?IOC(Inversion of Control)、控制反轉亦稱依賴注入.IOC容器

Spring注入方式

寫在前面,原諒我圖片黨了。只是喜歡裡邊一句 “一知半解比一無所知更痛苦。”——West World 在使用Spirng 注入的時候,多數情況下都不會在xml中去定義了,而是以註解的方式去宣告bean,然後宣告依賴的bean,就像下面這樣 如此多的注入方式,你一定花了眼,貌似功能都差不多,但