欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring IOC和DI實(shí)現(xiàn)原理及實(shí)例解析

 更新時間:2020年06月23日 11:41:14   作者:曾強(qiáng)  
這篇文章主要介紹了Spring IOC和DI實(shí)現(xiàn)原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

什么是Spring

Spring是一個以IoC和AOP為內(nèi)核的框架。

IoC(Inversion of Control ,控制反轉(zhuǎn))是Spring的基礎(chǔ)。

IoC簡單說就是創(chuàng)建對象由以前的程序員調(diào)用new 構(gòu)造方法,變成了交由Spring創(chuàng)建對象。

DI(Dependency Inject,依賴注入)與IoC的含義相同,只不過這兩個稱呼是從兩個角度描述的同一個概念。

簡單地說, DI就是對象的屬性,已經(jīng)被注入好相關(guān)值了,直接使用即可。

IoC-控制反轉(zhuǎn)

  把各個對象類封裝之后,通過IoC容器來關(guān)聯(lián)這些對象類。這樣對象與對象之間就通過IoC容器進(jìn)行聯(lián)系,而對象與對象之間沒有什么直接聯(lián)系。

  應(yīng)用程序在沒有引入IoC容器之前,對象A依賴對象B,那么A對象在實(shí)例化或者運(yùn)行到某一點(diǎn)的時候,自己必須主動創(chuàng)建對象B或者使用已經(jīng)創(chuàng)建好的對象B,其中不管是創(chuàng)建還是使用已創(chuàng)建的對象B,控制權(quán)都在應(yīng)用程序自身。

  如果應(yīng)用程序引入了Ioc容器之后,對象A和對象B之間失去了直接聯(lián)系,所以,當(dāng)對象A實(shí)例化和運(yùn)行時,如果需要對象B的話,IoC容器會主動創(chuàng)建一個對象B注入(即依賴注入)到對象A所需要的地方。由此,對象A獲得依賴對象B的過程,由主動行為變成了被動行為,即把創(chuàng)建對象交給了IoC容器處理,控制權(quán)顛倒過來了,這就是所謂的控制反轉(zhuǎn)。

DI-依賴注入

由IoC容器在運(yùn)行期間,動態(tài)地將某種依賴關(guān)系注入到對象之中。例如,將對象B注入(賦值)給對象A的成員變量。

  事實(shí)上,依賴注入(DI)和控制反轉(zhuǎn)(IoC)是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。依賴注入是從應(yīng)用程序的角度在描述,即應(yīng)用程序依賴容器創(chuàng)建并注入它所需要的外部資源;而控制反轉(zhuǎn)是從容器的角度在描述,即容器控制應(yīng)用程序,由容器反向的向應(yīng)用程序注入應(yīng)用程序所需要的外部資源。這里所說的外部資源可以是外部實(shí)例對象,也可能是外部文件對象等。

IoC與DI的實(shí)現(xiàn)

  (1)屬性setter方法注入:指IoC容器使用setter方法注入被依賴的實(shí)例。通過調(diào)用無參構(gòu)造器或無參靜態(tài)工廠方法實(shí)例化Bean后,調(diào)用該Bean的setter方法,即可實(shí)現(xiàn)基于setter方法的依賴注入。該方式簡單、直觀,而且容易理解,所以Spring的設(shè)置注入被大量使用。

package com.ssm.entry;

public class UserServiceImpl implements UserService {

	private UserDao userDao;
	
	// setter()實(shí)現(xiàn)依賴注入
	public void setUserDao(UserDao userDao){
		this.userDao = userDao;
	}
	
	public void login() {
		this.userDao.login();
		System.out.println("UserService login");
	}

}

  (2)構(gòu)造方法注入:指IoC容器使用構(gòu)造方法注入被依賴的實(shí)例。基于構(gòu)造方法的依賴注入通過調(diào)用帶參數(shù)的構(gòu)造方法來實(shí)現(xiàn),每個參數(shù)代表著一個依賴。

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-4.3.xsd">
    		
    <!-- 將指定類配置給Spring,讓Spring創(chuàng)建其對象的實(shí)例 控制反轉(zhuǎn) -->
		<bean id="UserDao" class="com.ssm.entry.UserDaoImpl"></bean>
		
		<!-- 添加一個id為userService的Bean 依賴注入-->
		<bean id="UserService" class="com.ssm.entry.UserServiceImpl">
			<!-- 將name為UserDao的Bean注入UserService實(shí)例中 -->
			<property name="UserDao" ref="UserDao"/>
		</bean>
</beans>

IoC測試

package com.ssm.entry;

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

public class IoC {
	public static void main(String[] args) {
		
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao)applicationContext.getBean("UserDao");
		userDao.login();
		
	}
}

DI測試

package com.ssm.entry;

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

public class DI {
	
	public static void main(String[] args) {
		ApplicationContext applicationContext = new 
				ClassPathXmlApplicationContext("applicationContext.xml");
		UserService userService = (UserService)applicationContext.getBean("UserService");
		userService.login();
	}
	
}

實(shí)體類及接口實(shí)現(xiàn)類略

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用Java實(shí)現(xiàn)更改Word中的頁面大小和頁面方向

    利用Java實(shí)現(xiàn)更改Word中的頁面大小和頁面方向

    這篇文章主要為大家詳細(xì)介紹了一種高效便捷的方法——通過Java應(yīng)用程序,以編程方式更改Word中的頁面大小和頁面方向,感興趣的可以了解一下
    2023-03-03
  • SpringMVC如何正確接收時間的請求示例分析

    SpringMVC如何正確接收時間的請求示例分析

    這篇文章主要為大家介紹了SpringMVC如何正確接收時間的請求示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 使用Nexus搭建Maven私服的方法步驟

    使用Nexus搭建Maven私服的方法步驟

    這篇文章主要介紹了使用Nexus搭建Maven私服的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)之散列表詳解

    Java數(shù)據(jù)結(jié)構(gòu)之散列表詳解

    散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。本文將為大家具體介紹一下散列表的原理及其代碼實(shí)現(xiàn)
    2022-01-01
  • Spring Cloud微服務(wù)使用webSocket的方法

    Spring Cloud微服務(wù)使用webSocket的方法

    WebSocket在現(xiàn)代瀏覽器中的應(yīng)用已經(jīng)算是比較普遍了,在某些業(yè)務(wù)場景下,要求必須能夠在服務(wù)器端推送消息至客戶端,本文給大家介紹Spring Cloud微服務(wù)使用webSocket的方法,感興趣的朋友一起看看吧
    2021-06-06
  • dubbo入門指南及demo實(shí)例詳解

    dubbo入門指南及demo實(shí)例詳解

    Dubbo是一個分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案,這篇文章主要介紹了dubbo詳解及demo實(shí)例,需要的朋友可以參考下
    2022-04-04
  • rabbitmq中routingkey的作用說明

    rabbitmq中routingkey的作用說明

    這篇文章主要介紹了rabbitmq中routingkey的作用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Struts2中圖片以base64方式上傳至數(shù)據(jù)庫

    Struts2中圖片以base64方式上傳至數(shù)據(jù)庫

    這篇文章主要介紹了Struts2中圖片以base64方式上傳至數(shù)據(jù)庫的實(shí)現(xiàn)代碼,代碼分為前臺和后臺兩段,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Java設(shè)計模式之策略模式案例詳解

    Java設(shè)計模式之策略模式案例詳解

    策略模式(Strategy?Pattern)定義了一組同類型的算法,在不同的類中封裝起來,每種算法可以根據(jù)當(dāng)前場景相互替換,從而使算法的變化獨(dú)立于使用它們的客戶端即算法的調(diào)用者
    2022-07-07
  • 在Android的應(yīng)用中實(shí)現(xiàn)網(wǎng)絡(luò)圖片異步加載的方法

    在Android的應(yīng)用中實(shí)現(xiàn)網(wǎng)絡(luò)圖片異步加載的方法

    這篇文章主要介紹了在Android的應(yīng)用中實(shí)現(xiàn)網(wǎng)絡(luò)圖片異步加載的方法,一定程度上有助于提高安卓程序的使用體驗(yàn),需要的朋友可以參考下
    2015-07-07

最新評論