B057-spring增強 依賴注入 AOP 代理模式 創建Bean

目錄

      • AOP
        • 概念
        • 代理模式引出
        • AOP實現方式
          • xml方式實現
          • 注解方式實現

AOP

概念

在這里插入圖片描述
事務管理:比如可以抽取try catch的重復代碼
日志監控:比如業務邏輯前后打印關于當前訂單數量的日志,了解業務做了什么
性能監控:比如業務前后打印時間,相減可查看業務跑完所需時間

代理模式引出

在這里插入圖片描述
用aop實現擴展功能,
aop用代理模式實現,但是代理模式里的擴展功能還是需要我們自己寫,

靜態代理:相當于一個中介只代理一個固定的房東的房源,基本不用
動態代理:默認沒有,使用的時候動態生成

AOP:以上大方向
SpringAOP:AOP的spring實現方式,用動態代理方式實現。它的實現方式又有兩種:jdk,CGLIB,spring自動選擇用其中哪種方式,代理類自動生成也不用管,有接口的時候默認使用jdk,沒有的時候用cglib(第三方jar包),現在一般service都有接口

AOP實現方式

xml方式實現

1.編寫TxManager用來提供業務邏輯外的擴展功能 - 如事務管理

/*我們自己的擴展功能*/
public class TxManager {public void open (){System.out.println("開啟事務");}public void commit (){System.out.println("提交事務");}public void rollback(Throwable e){e.printStackTrace();//處理異常System.out.println("回滾事務");}public void close(){System.out.println("關閉事務");}public void around(ProceedingJoinPoint point){try {open();point.proceed();//執行真正的業務commit();} catch (Throwable e) {e.printStackTrace();rollback(e);} finally {close();}}
}

2.準備xmlAOP環境,在Spring配置文件中引入頭支持以支持aop標簽

SpringTest-Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

3.配置的三要素
何時,如在業務的執行前、后、catch
何地,指的是在哪一個方法
做什么,執行我們自定義擴展業務類的方法

面向切面編程,面向擴展功能編程
在這里插入圖片描述
其他
spring通過動態代理實現aop,配置aop后只能注入接口,通過接口找到被引用的代理類,Spring容器中就只有代理類沒有實現類,

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration//回到當前類的包下 查找當前類名-Context.xml的配置文件
public class SpringTest {@AutowiredIUserService userService;@Testpublic void testUser(){System.out.println(userService.getClass());}
}

SpringTest-Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="userService" class="cn.itsource._03aopxml.service.impl.UserServiceImpl"/><bean id="departmentService" class="cn.itsource._03aopxml.service.impl.DepartmentServiceImpl"/><!--將擴展功能交給Spring容器管理,方便AOP使用--><bean id="txManager" class="cn.itsource._03aopxml.TxManager"/><!--SpringAOP的核心配置--><aop:config><!--配置切點  配置何地 ==在哪一個方法執行expression:表達式  通過表達式,我們找在哪一個方法執行第一個*:任意返回值I*Service:所有以I開頭 Service結尾的類(里面的所有方法都加上事物)第三個*:任意方法save(..):任意參數--><!--execution(* cn.itsource._03aopxml.service.impl.UserServiceImpl.save(..))execution(* cn.itsource._03aopxml.service.impl.UserServiceImpl.*(..))--><aop:pointcut id="txPoint" expression="execution(* cn.itsource._03aopxml.service.I*Service.*(..))"/><!--配置切面   --><aop:aspect ref="txManager"><!--配置前置通知 配置何時做什么--><!--<aop:before method="open" pointcut-ref="txPoint"/>--><!--配置后置通知--><!--<aop:after-returning method="commit" pointcut-ref="txPoint"/>--><!--配置異常通知--><!--<aop:after-throwing method="rollback" pointcut-ref="txPoint" throwing="e"/>--><!--配置最終通知--><!--<aop:after method="close" pointcut-ref="txPoint"/>--><!--配置環繞通知  環繞通知一行頂上面四行--><aop:around method="around" pointcut-ref="txPoint"/></aop:aspect></aop:config>
</beans>

測試

詳細見工程代碼

注解方式實現

A 引入容器掃描頭 Spring AOP

SpringTest-Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--開啟Spring注解掃描--><context:component-scan base-package="cn.itsource._04aopanno"/><!--開啟SpringAOP 注解掃描--><aop:aspectj-autoproxy/></beans>

后面的幾步,都是在TxManager中完成
B 將擴展業務交給容器管理 @Component
C 申明pointcut,@Pointcut,需要提供一個空方法
D 配置各種通知
只用@Around環繞通知,其他四種通知不能確定執行順序,

/*我們自己的擴展功能*/
@Component //組件 把當前類交給Spring容器管理
@Aspect //== <aop:aspect ref="txManager"> 配置切面
public class TxManager {//配置切點  == <aop:pointcut id="txPoint"@Pointcut("execution(* cn.itsource._04aopanno.service.I*Service.*(..))")public void  txPoint(){/*這個方法指明在業務類中的每個方法*/}/*配置前置通知*//*@Before("txPoint()")*/public void open (){System.out.println("開啟事物");}/*@AfterReturning("txPoint()")*/public void commit (){System.out.println("提交事物");}/*@AfterThrowing(value = "txPoint()", throwing = "e")*/public void rollback(Throwable e){e.printStackTrace();//處理異常System.out.println("回滾事務");}/*@After("txPoint()")*/public void close(){System.out.println("關閉事物");}@Around("txPoint()")public void around(ProceedingJoinPoint point){try {open();point.proceed();//執行真正的業務commit();} catch (Throwable e) {e.printStackTrace();rollback(e);} finally {close();}}
}

測試

詳細見工程代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38196.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

浪潮信息趙帥:多元算力時代 開源開放的OpenBMC成為服務器管理優先解

“多元算力時代下&#xff0c;大規模的異構服務器設備面臨多種處理器架構、多種設備協議、不同管理芯片兼容的系統化設計挑戰&#xff0c;管理固件也迎來新的變革。開源開放的OpenBMC&#xff0c;以創新的分層解耦軟件架構&#xff0c;兼容不同處理器架構、算力平臺和管理芯片&…

人流目標跟蹤pyqt界面_v5_deepsort

直接上效果圖 代碼倉庫和視頻演示b站視頻006期&#xff1a; 到此一游7758258的個人空間-到此一游7758258個人主頁-嗶哩嗶哩視頻 代碼展示&#xff1a; YOLOv5 DeepSORT介紹 YOLOv5 DeepSORT是一個結合了YOLOv5和DeepSORT算法的目標檢測與多目標跟蹤系統。讓我為您詳細解釋一…

【字典學習+稀疏編碼Sparse Encoding】簡單介紹與sklearn的實現方式

文章目錄 1、字典學習與稀疏編碼2、sklearn的實現3、示例 1、字典學習與稀疏編碼 簡單來說&#xff0c;稀疏編碼就是把輸入向量&#xff08;信號&#xff09;/ 矩陣&#xff08;圖像&#xff09;表示為稀疏的系數向量和一組超完備基向量&#xff08;字典&#xff09;的線性組合…

vim打開文件中文是亂碼

vim打開文件中文是亂碼 問題&#xff1a;在Linux系統下&#xff0c;使用cat查看含有中文的文本文件正常&#xff0c;但是使用vim打開卻是亂碼 解決方法&#xff1a; 方法一&#xff1a; 在文件中設定 在vim的退出模式下 :set encodingutf8 方法二&#xff1a; 直接寫入/etc/…

ASP.NET WEB API通過SugarSql連接MySQL數據庫

注意&#xff1a;VS2022企業版可以&#xff0c;社區版可能存在問題。實體名稱和字段和數據庫中的要一致。 1、創建項目&#xff0c;安裝SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件結構 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …

Ubuntu 軟件依賴出錯處理

現象&#xff1a; apt-get install vim 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 您可能需要運行“apt-get -f install”來糾正下列錯誤&#xff1a; 下列軟件包有未滿足的依賴關系&#xff1a; cuttlefish-base : 依賴: f2fs-tools…

DG故障切換及DG Broker失效配置清理

DG故障切換及DG Broker失效配置清理 DG故障強制切主DG Broker原有配置清理 DG故障強制切主 主庫發生故障無法在短時間內恢復時&#xff0c;需要執行主備切換。此時由于DG Broker無法連接到主庫&#xff0c;故不能通過Broker切換&#xff0c;只能手動在備庫進行切主。 --斷開備…

Neo4j之MERGE基礎

在 Neo4j 中&#xff0c;MERGE 語句用于根據指定的模式進行創建或匹配節點和關系。它可以在節點或關系不存在時創建它們&#xff0c;并在已存在時進行匹配。 創建或匹配節點&#xff1a; MERGE (p:Person {name: John});這個查詢會檢查是否已經存在一個具有 "Person&quo…

搭建WebDAV服務手機ES文件瀏覽器遠程訪問

文章目錄 1. 安裝啟用WebDAV2. 安裝cpolar3. 配置公網訪問地址4. 公網測試連接5. 固定連接公網地址6. 使用固定地址測試連接 有時候我們想通過移動設備訪問群暉NAS 中的文件,以滿足特殊需求,我們在群輝中開啟WebDav服務,結合cpolar內網工具生成的公網地址,通過移動客戶端ES文件…

【LeetCode 算法】Find And Replace in String 字符串中的查找與替換-排序模擬

文章目錄 Find And Replace in String 字符串中的查找與替換問題描述&#xff1a;分析代碼排序模擬 Tag Find And Replace in String 字符串中的查找與替換 問題描述&#xff1a; 你會得到一個字符串 s (索引從 0 開始)&#xff0c;你必須對它執行 k 個替換操作。替換操作以三…

docker通用鏡像方法,程序更新時不用重新構建鏡像

docker通用鏡像方法&#xff0c;程序更新時不用重新構建鏡像。更新可執行文件后&#xff0c;重新啟動容器就可運行。 功能 1、在demo目錄下添加腳本文件start.sh&#xff0c;里面執行demo.jar文件。 2、將demo目錄映射到鏡像下的 /workspace目錄。 3、Dockerfile文件中默認…

如何在Linux中強制關閉卡住的PyCharm

在使用PyCharm進行Python開發時&#xff0c;有時可能會遇到卡頓或無響應的情況。當PyCharm卡住時&#xff0c;我們需要強制關閉它以恢復正常操作。今天&#xff0c;我們將介紹在Linux系統中如何強制關閉PyCharm的幾種方法。 1. 使用鍵盤快捷鍵 在PyCharm所在的窗口中&#xf…

臺灣shopee:蝦皮電商平臺選品方法與市場機遇

臺灣Shopee蝦皮電商平臺為臺灣本土賣家和消費者提供了一個線上交易平臺。對于想要在臺灣市場做蝦皮電商的賣家來說&#xff0c;選擇合適的產品是非常重要的。本文介紹一些做蝦皮電商的選品方法和策略。 首先&#xff0c;了解市場需求是選品的基礎。在進入臺灣Shopee市場之前&a…

【Spring專題】Spring之Bean的生命周期源碼解析——階段二(IOC之實例化)

目錄 前言閱讀準備閱讀指引閱讀建議 課程內容一、SpringIOC之實例化1.1 簡單回顧1.2 概念回顧1.3 核心方法講解 二、方法講解2.1 AbstractBeanFactory#getMergedLocalBeanDefinition&#xff1a;合并BeanDefinition2.2 AbstractAutowireCapableBeanFactory#createBean&#xff…

oracle修改臨時表出現已使用的事務正在處理臨時表問題

錯誤提示&#xff1a; ORA-14450:試圖訪問已經在使用的事務處理臨時表 解決方法&#xff1a; 通過第一句sql來查找臨時表的object_id &#xff0c;然后代入第二局sql來生成第三句sql語句。 最后再執行第三句sql語句即可kill session&#xff0c;執行修改表的操作。 SELECT * F…

華為OD機試-射擊比賽成績

題目描述 射擊比賽成績統計 給定一個射擊比賽成績單 包含多個選手若干次射擊的成績分數 請對每個選手按其最高三個分數之和進行降序排名 輸出降序排名后的選手ID序列 條件如下: 一個選手可以有多個射擊成績的分數 且次序不固定 如果一個選手成績小于三個 則認為選手的所有成績…

【Go 基礎篇】Go語言基本數據類型轉換:字符串、整數、浮點數、字符與布爾類型的轉換

介紹 在計算機編程中&#xff0c;不同的數據類型用于表示不同種類的數據。在Go語言&#xff08;Golang&#xff09;中&#xff0c;基本數據類型包括字符串、整數、浮點數、字符和布爾類型。在實際開發中&#xff0c;經常需要進行不同數據類型之間的轉換&#xff0c;以滿足不同…

安達發APS|APS排產軟件之計劃甘特圖

在當今全球化和競爭激烈的市場環境下&#xff0c;制造業企業面臨著巨大的壓力&#xff0c;如何在保證產品質量、降低成本以及滿足客戶需求的同時&#xff0c;提高生產效率和競爭力成為企業需要迫切解決的問題。在這個背景下&#xff0c;生產計劃的制定和執行顯得尤為重要。然而…

2023年京東按摩儀行業數據分析(京東銷售數據分析)

近年來&#xff0c;小家電行業憑借功能與顏值&#xff0c;取代黑電和白電&#xff0c;成為家電市場的主要增長點。在這一市場背景下&#xff0c;顏值更高、功能更豐富、品種更齊全的各類按摩儀&#xff0c;借助新消費和電子商務的風潮&#xff0c;陸續被推上市場。今年&#xf…

【Cocos Creator 項目實戰 】消滅星星加強版(附帶完整源碼工程)

本文乃Siliphen原創&#xff0c;轉載請注明出處 目錄 概述 游戲整體流程 游戲框架設計 單一職責的類 主要流程控制類 核心玩法模塊 UI&#xff1a; 游戲世界&#xff1a; 本文項目的代碼組織結構 作者項目實踐總結 場景只有一個入口腳本 盡量少在節點上掛載腳本 構…