一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解讀Spring源碼中的IOC和AOP部分

冬至子 ? 來(lái)源:good7ob ? 作者:good7ob ? 2023-06-06 15:49 ? 次閱讀

Spring Framework 是一個(gè)非常流行的開源框架,為 Java 應(yīng)用程序提供了廣泛的支持和功能。其中,IOC 和 AOP 是 Spring Framework 中最重要的兩個(gè)部分之一,也是 Spring Framework 能夠如此受歡迎的關(guān)鍵所在。

本文將深入淺出地解讀 Spring 源碼中的 IOC 和 AOP 部分,包含詳細(xì)的解決思路和方案、有步驟和代碼、有實(shí)際的案例,旨在幫助讀者更好地理解和使用 Spring Framework。

一、IOC

什么是IOC

  • IOC(Inversion of Control,控制反轉(zhuǎn))是 Spring Framework 的核心概念之一,它是一種面向?qū)ο?a target="_blank">編程的設(shè)計(jì)模式,用于實(shí)現(xiàn)松耦合和可重用的代碼。
  • IOC 的基本思想是,將對(duì)象之間的依賴關(guān)系交由框架來(lái)管理,而不是由程序員手動(dòng)編寫代碼來(lái)管理。
  • 在傳統(tǒng)的編程模型中,對(duì)象之間的依賴關(guān)系通常是硬編碼在程序中的,這樣會(huì)導(dǎo)致代碼的耦合度很高,不利于代碼的維護(hù)和重用。
  • 而采用 IOC 模式可以將對(duì)象之間的依賴關(guān)系解耦,使得程序更加靈活、可擴(kuò)展。

Spring IOC 的實(shí)現(xiàn)原理

  • Spring IOC 的實(shí)現(xiàn)原理是通過(guò)容器來(lái)管理對(duì)象之間的依賴關(guān)系。
  • 容器在初始化時(shí)會(huì)讀取配置文件,創(chuàng)建并裝配對(duì)象,將它們注入到其他對(duì)象中,以實(shí)現(xiàn)對(duì)象之間的依賴關(guān)系。
  • Spring IOC 容器可以根據(jù)配置文件中的信息來(lái)創(chuàng)建對(duì)象、管理對(duì)象之間的依賴關(guān)系,并為對(duì)象注入屬性。
  • 在 Spring Framework 中,IOC 的實(shí)現(xiàn)主要依靠?jī)蓚€(gè)核心接口:BeanFactory 和 ApplicationContext。
  • BeanFactory 是 IOC 容器的最基本接口,提供了最簡(jiǎn)單的 IOC 容器的實(shí)現(xiàn),而 ApplicationContext 是 BeanFactory 的一個(gè)子接口,提供了更多的功能,包括 AOP、事件傳遞、國(guó)際化等。

    下面我們來(lái)看一下 Spring IOC 的具體實(shí)現(xiàn)過(guò)程。

(1)創(chuàng)建配置文件

首先,我們需要?jiǎng)?chuàng)建一個(gè) XML 配置文件,用于描述對(duì)象之間的依賴關(guān)系。在配置文件中,我們需要定義 Bean 的名稱、類名和屬性值等信息。下面是一個(gè)簡(jiǎn)單的例子:

< bean id="userService" class="com.example.UserService" >
  < property name="userDao" ref="userDao"/ >
< /bean >

< bean id="userDao" class="com.example.UserDaoImpl" >
  < property name="dataSource" ref="dataSource"/ >
< /bean >

< bean id="dataSource" class="com.example.DataSource" >
  < property name="url" value="jdbc:mysql://localhost:3306/test"/ >
  < property name="username" value="root"/ >
  < property name="password" value="123456"/ >
< /bean

(2)加載配置文件

  • 在 Spring IOC 中,容器會(huì)在啟動(dòng)時(shí)自動(dòng)加載配置文件,創(chuàng)建并初始化 IOC 容器。容器會(huì)解析 XML 配置文件,根據(jù)配置文件中的信息創(chuàng)建相應(yīng)的 Bean,并將它們注冊(cè)到 IOC 容器中。
  • 在 Spring 中,容器的實(shí)現(xiàn)類有很多種,其中最常用的是 ApplicationContext 和 ClassPathXmlApplicationContext。ClassPathXmlApplicationContext 可以從類路徑下加載 XML 配置文件,創(chuàng)建一個(gè) IOC 容器,并根據(jù)配置文件中的信息創(chuàng)建 Bean。下面是一個(gè)簡(jiǎn)單的例子:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

(3)獲取 Bean

  • 在 Spring IOC 容器中,我們可以通過(guò) Bean 的名稱或類型來(lái)獲取 Bean 的實(shí)例。
  • 容器會(huì)在初始化時(shí)自動(dòng)創(chuàng)建 Bean,并將其注冊(cè)到 IOC 容器中,我們可以通過(guò)容器來(lái)獲取相應(yīng)的 Bean 實(shí)例。
UserService userService = (UserService) context.getBean("userService");

(4)Bean 的作用域

  • 在 Spring 中,Bean 的作用域指的是 Bean 實(shí)例的生命周期。
  • Spring 提供了五種常用的 Bean 作用域,分別是 Singleton、Prototype、Request、Session 和 Global Session。
  • 其中,Singleton 是默認(rèn)的 Bean 作用域,每個(gè) Bean 在 IOC 容器中只有一個(gè)實(shí)例;
  • Prototype 每次都會(huì)創(chuàng)建一個(gè)新的 Bean 實(shí)例;Request 和 Session 分別在 Web 應(yīng)用程序的請(qǐng)求和會(huì)話范圍內(nèi)有效;Global Session 則在 Portlet 環(huán)境下使用。

(5)Bean 的依賴注入

Spring IOC 容器會(huì)自動(dòng)管理對(duì)象之間的依賴關(guān)系,并將它們注入到對(duì)象中。在配置文件中,我們可以通過(guò) property 元素來(lái)設(shè)置 Bean 的屬性值。下面是一個(gè)簡(jiǎn)單的例子:

< bean id="userService" class="com.example.UserService" >
  < property name="userDao" ref="userDao"/ >
< /bean >

< bean id="userDao" class="com.example.UserDaoImpl" >
  < property name="dataSource" ref="dataSource"/ >
< /bean >

< bean id="dataSource" class="com.example.DataSource" >
  < property name="url" value="jdbc:mysql://localhost:3306/test"/ >
  < property name="username" value="root"/ >
  < property name="password" value="123456"/ >
< /bean >

在上面的配置文件中,我們定義了三個(gè) Bean:userService、userDao 和 dataSource。其中,userService 依賴于 userDao,而 userDao 又依賴于 dataSource。

通過(guò)配置文件,我們將 dataSource 注入到 userDao 中,將 userDao 注入到 userService 中,實(shí)現(xiàn)了三個(gè) Bean 之間的依賴關(guān)系。

二、AOP

什么是 AOP

  • AOP(Aspect-Oriented Programming,面向切面編程)是一種面向?qū)ο缶幊痰脑O(shè)計(jì)模式,用于解決系統(tǒng)中的橫切關(guān)注點(diǎn)。
  • AOP 的基本思想是將橫切關(guān)注點(diǎn)(如事務(wù)管理、安全檢查等)從業(yè)務(wù)邏輯中分離出來(lái),以增強(qiáng)程序的模塊化、可維護(hù)性和可重用性。
  • 在 AOP 中,切面(Aspect)是一組關(guān)注點(diǎn)的集合,通常包括多個(gè)切點(diǎn)(Join Point)和增強(qiáng)(Advice)。
  • 切點(diǎn)是程序中的特定位置,如方法調(diào)用、異常處理等。增強(qiáng)則是對(duì)切點(diǎn)執(zhí)行的操作,如在方法調(diào)用前、后或拋出異常時(shí)執(zhí)行某個(gè)操作。

AOP 的實(shí)現(xiàn)方式

  • AOP 的實(shí)現(xiàn)方式主要有兩種:基于代理(Proxy-based)和基于字節(jié)碼操作(Bytecode manipulation)。
  • 在基于代理的實(shí)現(xiàn)方式中,AOP 框架會(huì)在運(yùn)行時(shí)動(dòng)態(tài)地為目標(biāo)對(duì)象生成一個(gè)代理對(duì)象,通過(guò)代理對(duì)象來(lái)織入切面邏輯。代理對(duì)象實(shí)現(xiàn)了目標(biāo)對(duì)象所實(shí)現(xiàn)的接口,并將所有的方法調(diào)用轉(zhuǎn)發(fā)給目標(biāo)對(duì)象。在調(diào)用目標(biāo)對(duì)象的方法前后,代理對(duì)象會(huì)執(zhí)行相應(yīng)的增強(qiáng)邏輯。
  • 在基于字節(jié)碼操作的實(shí)現(xiàn)方式中,AOP 框架會(huì)通過(guò)修改字節(jié)碼來(lái)織入切面邏輯。這種方式可以在編譯期或加載期對(duì)字節(jié)碼進(jìn)行修改,從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的增強(qiáng)。

Spring AOP

  • Spring AOP 是 Spring 框架中的一個(gè)模塊,提供了對(duì) AOP 的支持。它基于代理的實(shí)現(xiàn)方式,使用 JDK 動(dòng)態(tài)代理或 CGLIB 代理來(lái)生成代理對(duì)象。
  • 在 Spring AOP 中,切面通常由增強(qiáng)和切點(diǎn)組成。增強(qiáng)定義了在切點(diǎn)執(zhí)行前、后或拋出異常時(shí)要執(zhí)行的操作,而切點(diǎn)定義了在哪些位置執(zhí)行增強(qiáng)操作。
  • Spring AOP 支持四種類型的增強(qiáng):前置增強(qiáng)、后置增強(qiáng)、環(huán)繞增強(qiáng)和異常增強(qiáng)。
  • 前置增強(qiáng)是在目標(biāo)方法執(zhí)行前執(zhí)行的操作,后置增強(qiáng)是在目標(biāo)方法執(zhí)行后執(zhí)行的操作,環(huán)繞增強(qiáng)是在目標(biāo)方法執(zhí)行前后都執(zhí)行的操作,異常增強(qiáng)是在目標(biāo)方法拋出異常時(shí)執(zhí)行的操作。

AOP 的應(yīng)用場(chǎng)景

AOP 的應(yīng)用場(chǎng)景包括但不限于以下幾個(gè)方面:

  • 日志記錄:在方法執(zhí)行前后記錄方法的輸入?yún)?shù)和返回值等信息。
  • 安全控制:檢查用戶是否有權(quán)限執(zhí)行某個(gè)操作。
  • 性能監(jiān)控:在方法執(zhí)行前后記錄方法的執(zhí)行時(shí)間,統(tǒng)計(jì)方法的調(diào)用次數(shù)等。
  • 事務(wù)管理:在方法執(zhí)行前后開啟和關(guān)閉事務(wù),控制事務(wù)的提交和回滾。

總結(jié)

  • Spring 框架是目前最流行的企業(yè)級(jí) Java 應(yīng)用開發(fā)框架之一,它提供了一系列的特性和功能,使得開發(fā)者可以更加方便地開發(fā)高質(zhì)量的企業(yè)級(jí)應(yīng)用。
  • 本文主要介紹的是 Spring AOP,它是 Spring 框架中的一個(gè)模塊,提供了對(duì) AOP 的支持。AOP 是一種編程范式,通過(guò)將一些與業(yè)務(wù)邏輯無(wú)關(guān)的橫切關(guān)注點(diǎn)分離出來(lái),從而提高了代碼的可維護(hù)性和可重用性。
  • AOP 的實(shí)現(xiàn)方式主要有基于代理和基于字節(jié)碼操作兩種。Spring AOP 使用基于代理的實(shí)現(xiàn)方式,通過(guò) JDK 動(dòng)態(tài)代理或 CGLIB 代理生成代理對(duì)象,并在代理對(duì)象上織入切面邏輯。
  • 在 Spring AOP 中,切面由增強(qiáng)和切點(diǎn)組成。增強(qiáng)定義了在切點(diǎn)執(zhí)行前、后或拋出異常時(shí)要執(zhí)行的操作,而切點(diǎn)定義了在哪些位置執(zhí)行增強(qiáng)操作。Spring AOP 支持四種類型的增強(qiáng):前置增強(qiáng)、后置增強(qiáng)、環(huán)繞增強(qiáng)和異常增強(qiáng)。
  • AOP 的應(yīng)用場(chǎng)景包括但不限于日志記錄、安全控制、性能監(jiān)控和事務(wù)管理等。在實(shí)際的開發(fā)中,我們可以使用 AOP 來(lái)實(shí)現(xiàn)這些功能,從而提高代碼的質(zhì)量和可維護(hù)性。
  • 綜上所述,Spring AOP 是 Spring 框架中非常重要的一個(gè)模塊,它提供了對(duì) AOP 的支持,使得我們可以更加方便地開發(fā)高質(zhì)量的企業(yè)級(jí)應(yīng)用。
  • 掌握 Spring AOP 對(duì)于 Java 開發(fā)者來(lái)說(shuō)非常重要,希望本文能夠幫助大家更好地理解和應(yīng)用 Spring AOP。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20462
  • AOP
    AOP
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    11177
  • XML技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    6094
  • IOC
    IOC
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    10252
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Spring AOP如何破解java應(yīng)用

    降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。 Spring AOPIOC作為整個(gè)Spring框架最為核心的
    的頭像 發(fā)表于 09-25 11:16 ?1069次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>AOP</b>如何破解java應(yīng)用

    java spring教程

    java spring教程理解Spring 實(shí)現(xiàn)原理掌握Spring IOC,AOP掌握Spring
    發(fā)表于 09-11 11:09

    什么是java spring

    或多個(gè)模塊聯(lián)合實(shí)現(xiàn)簡(jiǎn)單來(lái)說(shuō),Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。■ 輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的
    發(fā)表于 09-11 11:16

    Spring工作原理

    本文介紹Spring工作原理,以及IoC(Inversion of control): 控制反轉(zhuǎn)和AOP(Aspect-Oriented Programming): 面向方面編程
    發(fā)表于 07-10 07:41

    Spring筆記分享

    Spring實(shí)現(xiàn)了使用簡(jiǎn)單的組件配置組合成一個(gè)復(fù)雜的應(yīng)用。在 Spring 可以使用XML和Java注解組合這些對(duì)象。6) 一站式:在IOCA
    發(fā)表于 11-04 07:51

    軟內(nèi)部培訓(xùn)資料

    理解Spring 實(shí)現(xiàn)原理掌握Spring IOC,AOP掌握Spring的基礎(chǔ)配置和用法熟練使用SSH開發(fā)項(xiàng)目
    發(fā)表于 09-11 10:56 ?10次下載

    spring教程ppt

    主要內(nèi)容Spring 概述Spring 整體結(jié)構(gòu)Spring實(shí)例Spring核心概念介紹控制反轉(zhuǎn)(IOC)依賴注入(DI)
    發(fā)表于 09-11 11:00 ?138次下載
    <b class='flag-5'>spring</b>教程ppt

    spring實(shí)現(xiàn)ioc的方法詳解

    控制反轉(zhuǎn)IoC(Inversion of Control),是一種設(shè)計(jì)思想,DI(依賴注入)是實(shí)現(xiàn)IoC的一種方法,也有人認(rèn)為DI只是IoC的另一種說(shuō)法。沒(méi)有IoC的程序
    發(fā)表于 01-28 10:38 ?3625次閱讀
    <b class='flag-5'>spring</b><b class='flag-5'>中</b>實(shí)現(xiàn)<b class='flag-5'>ioc</b>的方法詳解

    Spring認(rèn)證」Spring IoC 容器

    ,我們將在下一章討論。 容器通過(guò)讀取提供的配置元數(shù)據(jù)來(lái)獲取有關(guān)要實(shí)例化、配置和配置哪些對(duì)象的指令。數(shù)據(jù)可以由XML、Java注釋或Java代碼表示。下圖展示了Spring如何工作的高級(jí)視圖。 IoC
    的頭像 發(fā)表于 06-28 13:27 ?874次閱讀
    「<b class='flag-5'>Spring</b>認(rèn)證」<b class='flag-5'>Spring</b> <b class='flag-5'>IoC</b> 容器

    spring聲明式事務(wù)實(shí)現(xiàn)原理猜想

    專注于業(yè)務(wù)層面開發(fā)。 ? 我們知道實(shí)現(xiàn)@Transactional原理是基于spring aop,aop又是動(dòng)態(tài)代理模式的實(shí)現(xiàn),通過(guò)對(duì)源碼的閱讀,總結(jié)
    的頭像 發(fā)表于 10-13 09:20 ?1737次閱讀

    SpringBean的生命周期是怎樣的?

    1. 基礎(chǔ)知識(shí) 1.1 什么是 IoC ? 1.2 Bean 生命周期 1.3 執(zhí)行流程 1.4 擴(kuò)展方法 2. 源碼解讀 2.1 代碼入口 2.2 實(shí)例化 2.3 屬性賦值 2.4 初始化 2.5
    的頭像 發(fā)表于 10-11 15:08 ?1538次閱讀

    剖析Spring中最常用的擴(kuò)展點(diǎn)(上)

    我們一說(shuō)到spring,可能第一個(gè)想到的是 `IOC`(控制反轉(zhuǎn)) 和 `AOP`(面向切面編程)。 沒(méi)錯(cuò),它們是spring的基石,得益于它們的優(yōu)秀設(shè)計(jì),使得
    的頭像 發(fā)表于 02-15 16:06 ?882次閱讀
    剖析<b class='flag-5'>Spring</b>中最常用的擴(kuò)展點(diǎn)(上)

    剖析Spring中最常用的擴(kuò)展點(diǎn)(

    我們一說(shuō)到spring,可能第一個(gè)想到的是 `IOC`(控制反轉(zhuǎn)) 和 `AOP`(面向切面編程)。 沒(méi)錯(cuò),它們是spring的基石,得益于它們的優(yōu)秀設(shè)計(jì),使得
    的頭像 發(fā)表于 02-15 16:06 ?650次閱讀
    剖析<b class='flag-5'>Spring</b>中最常用的擴(kuò)展點(diǎn)(<b class='flag-5'>中</b>)

    剖析Spring中最常用的擴(kuò)展點(diǎn)(下)

    我們一說(shuō)到spring,可能第一個(gè)想到的是 `IOC`(控制反轉(zhuǎn)) 和 `AOP`(面向切面編程)。 沒(méi)錯(cuò),它們是spring的基石,得益于它們的優(yōu)秀設(shè)計(jì),使得
    的頭像 發(fā)表于 02-15 16:07 ?601次閱讀

    SSM框架的源碼解析與理解

    的核心是控制反轉(zhuǎn)(IoC)和面向切面編程(AOP)。 源碼解析: Spring源碼主要分為以下幾個(gè)部分
    的頭像 發(fā)表于 12-17 09:20 ?712次閱讀