xml的方式配置AOP:Aspect Oriented Programming

在某些類中, 什么時機, 做什么事情
?切入點(point-cut): 在某些類中(Class<?>[] itfc = new Class<?>[] { IStudentService.class })
?通知: 什么時機, 做什么事情(InvocationHandler的invoke方法)
?切面: 切入點 + 通知
?織入(weaver): Proxy.newProxyInstance: 把切入點和通知施加到具體的業務邏輯上的過程

XML配置AOP步驟:
?1,準備了一個實現接口的bean, 還有一個事務的碎片化方法的類;
?2,把這兩個類配置到Spring容器中;
?3,配置springAOP
? 1)引入aop命名空間;
? 2)配置AOP,格式如下
? <aop:config>
????? <aop:point-cut expression=""? id="sample" />
????? <aop:aspect ref="">
?????????? <aop:before method="" pointcut-ref="sample">
?????????? <aop:after-returning method="" pointcut-ref="sample">
?????????? <aop:after-throwing method="" pointcut-ref="sample">
????? </aop:aspect>
? </aop:config>
? ?1] aop:config: AOP配置
? ?2] aop:point-cut: AOP切入點
? ?3] aop:aspect: AOP切面配置
? ?4] aop:* 都是一個AOP切面

?4,在接口文件中配置一個業務邏輯對象的接口,DI注入,并在test方法中直接調用該接口的具體業務邏輯

//接口:
package com.xk.spring.kp04_aop.aop.s01_xml;public interface IStudentService {public void save(Student stu);public void update(Student stu);
}
//Dao 實現類(service) 實現業務邏輯
package com.xk.spring.kp04_aop.aop.s01_xml;public class StudentServiceImpl implements IStudentService {@Overridepublic void save(Student stu) {System.out.println("調用Dao的save方法....");}@Overridepublic void update(Student stu) {System.out.println("調用Dao的update方法...");@SuppressWarnings("unused")int i = 10/0;}
}
//事物管理:將代碼中的污染源抽出一個類,專門處理事物
package com.xk.spring.kp04_aop.aop.s01_xml;public class TransactionManager {/*** 事物開始*/public void begin(){System.out.println("TransactionManager.begin()");}/*** 事物提交*/public void commit(){System.out.println("TransactionManager.commit()");}/*** 事物回滾*/public void rollback(Throwable e){System.out.println("TransactionManager.rollback()");System.out.println("rollback()");}/*** 事物結束*/public void finished(){System.out.println("TransactionManager.close()");}
}
//Bean
//將bean注入就是指將數據注入Spring
package com.xk.spring.kp04_aop.aop.s01_xml;public class Student {private String name;private Integer age;public Student() {}public Student(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}

  

//測試類
package com.xk.spring.kp04_aop.aop.s01_xml;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class AOPXMLTest {@AutowiredIStudentService seriver;@Testpublic void testAOPXML() throws Exception {seriver.save(new Student("張三", 18));seriver.update(new Student("張4", 18));}
}
<!-- xml配置aop -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="service" class="com.xk.spring.kp04_aop.aop.s01_xml.StudentServiceImpl" /><bean id="manager" class="com.xk.spring.kp04_aop.aop.s01_xml.TransactionManager" /><aop:config><!-- 需要導入兩個依賴包 com.springsource.org.aopalliance-1.0.0.jar和com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar --><aop:pointcutexpression="execution(* com.xk.spring.kp04_aop.aop.s01_xml.*Service.*(..))"id="stuService" /><aop:aspect ref="manager"><aop:before method="begin" pointcut-ref="stuService" /><!-- 回滾:在回滾的時候 throwing是要在TransactionManager類中配置的 參數"(throwable e)" --><aop:after-throwing method="rollback"pointcut-ref="stuService" throwing="e" /></aop:aspect></aop:config>
</beans><!-- 錯誤:Pointcut is not well-formed: expecting 'name pattern' at character position 配置aop報錯:原因是配置切點表達式的時候報錯了, 星號后面沒有加空格: <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* project.mybatis.service.*.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="omsMTransactionAdvice" /> </aop:config> 其中,切入點表達式的使用規則: 1、execution(): 表達式主體。 2、第一個*號:表示返回類型,*號表示所有的類型。 3、包名:表示需要攔截的包名,后面的兩個句點表示當前包和當前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。 4、第二個*號:表示類名,*號表示所有的類。 5、*(..):最后這個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數,兩個句點表示任何參數。 -->

?

轉載于:https://www.cnblogs.com/huike/p/6636731.html

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

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

相關文章

[No0000112]ComputerInfo,C#獲取計算機信息(cpu使用率,內存占用率,硬盤,網絡信息)...

github地址&#xff1a;https://github.com/charygao/SmsComputerMonitor 軟件用于實時監控當前系統資源等情況&#xff0c;并調用接口&#xff0c;當資源被超額占用時&#xff0c;發送警報到個人手機&#xff1b;界面模擬Console的顯示方式&#xff0c;信息緩沖大小由配置決定…

I2C總線之(一)---概述

概述&#xff1a;IC 是Inter-Integrated Circuit的縮寫&#xff0c;發音為"eye-squared cee" or "eye-two-cee" , 它是一種兩線接口。 IC 只是用兩條雙向的線&#xff0c;一條 Serial Data Line (SDA) &#xff0c;另一條Serial Clock (SCL)。 SCL&#xf…

js中級(1)

動畫(1) Css樣式提供了運動 過渡的屬性transition 從一種情況到另一種情況叫過渡 Transition:attr time linear delay&#xff1b; Attr 是變化的屬性 Time 是花費的時間 Linear 變化的速度 Delay 是延遲 復習background:url() no-repeat 50% 50% red; Background-image Ba…

I2C總線之(二)---時序

一、協議 1.空閑狀態 I2C總線總線的SDA和SCL兩條信號線同時處于高電平時&#xff0c;規定為總線的空閑狀態。此時各個器件的輸出級場效應管均處在截止狀態&#xff0c;即釋放總線&#xff0c;由兩條信號線各自的上拉電阻把電平拉高。 2.起始位與停止位的定義&#xff1a; 起始信…

微信小程序設置底部導航欄目方法

微信小程序底部想要有一個漂亮的導航欄目&#xff0c;不知道怎么制作&#xff0c;于是百度找到了本篇文章&#xff0c;分享給大家。 好了 小程序的頭部標題 設置好了&#xff0c;我們來說說底部導航欄是如何實現的。 我們先來看個效果圖 這里&#xff0c;我們添加了三個導航圖標…

HTTP協議(3)瀏覽器的使用之查看源碼

在做CTF的Web類題目時&#xff0c;推薦使用Firefox瀏覽器。下面介紹一些在解題過程中關于瀏覽器的常用技巧。首先就是查看源碼。在做Web題目時&#xff0c;經常需要查看網站源碼&#xff0c;有的flag直接就藏在源碼中&#xff0c;有些題目則是在源碼中給出提示和線索&#xff0…

Autofac IoC容器基本使用步驟【1】

原文&#xff1a;http://www.bkjia.com/Asp_Netjc/888119.html 【原文中有一個地方報錯&#xff0c;下面已修改】 一.基本步驟: 1.設計適合控制反轉(IoC)的應用程序 2.給應用程序Autofac 引用. 3.注冊組件. 4.創建一個Container以備后用. 5.從Container創建一個 lifetime scop…

I2C總線之(三)---以C語言理解IIC

為了加深對I2C總線的理解&#xff0c;用C語言模擬IIC總線&#xff0c;邊看源代碼邊讀波形&#xff1a; 如下圖所示的寫操作的時序圖&#xff1a; 讀時序的理解同理。對于時序不理解的朋友請參考“I2C總線之(二)---時序” 完整的程序如下&#xff1a; #include<reg51.h>…

結對編程總結

這個項目我和我的結對伙伴共花了兩個月時間&#xff0c;之所以選這個項目&#xff0c;因為我們之前都學習過Python&#xff0c;也做過類似的程序&#xff0c;相比較其他項目而言&#xff0c;這個項目更合適&#xff0c;也讓我們對詞頻統計方面的知識加深了了解。寫這個程序我們…

JavaScript初學者必看“new”

2019獨角獸企業重金招聘Python工程師標準>>> 譯者按: 本文簡單的介紹了new, 更多的是介紹原型(prototype)&#xff0c;值得一讀。 原文: JavaScript For Beginners: the ‘new’ operator 譯者: Fundebug 為了保證可讀性&#xff0c;本文采用意譯而非直譯。 <di…

libGDX-wiki發布

為方便大家學習和訪問&#xff0c;我將libgdx的wiki爬取到doku-wiki下&#xff0c;專門建立了以下地址。歡迎大家來共同完善。 http://wiki.v5ent.com 轉載于:https://www.cnblogs.com/mignet/p/ligbdx_wiki.html

I2C讀寫時序

1. I2C寫時序圖&#xff1a; 注意&#xff1a;最后一個byte后&#xff0c;結束標志在第十個CLK上升沿之后&#xff1a; 2. I2C讀時序圖&#xff1a; 注意&#xff1a;restart信號格式&#xff1b;讀操作結束前最后一組clk的最后一個上升沿&#xff0c;主機應發送NACK&#xff0…

網站性能優化

基本概念 1、網站吞吐量&#xff1a;TPS/每秒的事務數&#xff0c;QPS/每秒的查詢數&#xff0c;HPS/每秒的HTTP請求數 2、服務器性能指標&#xff1a;系統負載&#xff0c;內存使用&#xff0c;CPU使用&#xff0c;磁盤使用以及網絡I/O等 前端優化方法 1、減少HTTP請求&#x…

JAVA-容器(2)-Collection

&#xff08;基于JDK1.8源碼分析&#xff09; 一&#xff0c;Collection 所有實現Collection接口的類原則上應該提供兩種構造函數&#xff1a; 【1】無參構造-創建一個空的容器 【2】有參構造-創建一個新的Collection&#xff0c;這個新的Collection和傳入的Collection具有相同…

軟件測試工具LoadRunner中如何定義SLA?--轉載

軟件測試工具LoadRunner中如何定義SLA&#xff1f; 瀏覽&#xff1a;2242|更新&#xff1a;2017-04-09 22:50SLA 是您為負載測試場景定義的具體目標。Analysis 將這些目標與軟件測試工具LoadRunner在運行過程中收集和存儲的性能相關數據進行比較&#xff0c;然后確定目標的 SLA…

最近閱讀20171106

java面試題 線上服務內存OOM問題定位三板斧 JVM的GC ROOTS存在于那些地方 mysql innodb怎樣做查詢優化 ----未閱讀 JAVA CAS原理深度分析----未閱讀 轉載于:https://www.cnblogs.com/Tpf386/p/7793248.html

LinuxI2C驅動--從兩個訪問eeprom的例子開始

本小節介紹兩個在linux應用層訪問eeprom的方法&#xff0c;并給出示例代碼方便大家理解。第一個方法是通過sysfs文件系統對eeprom進行訪問&#xff0c;第二個方法是通過eeprom的設備文件進行訪問。這兩個方法分別對應了i2c設備驅動的兩個不同的實現&#xff0c;在后面的小結會詳…

Cookie詳解整理

1.Cookie的誕生 由于HTTP協議是無狀態的&#xff0c;而服務器端的業務必須是要有狀態的。Cookie誕生的最初目的是為了存儲web中的狀態信息&#xff0c;以方便服務器端使用。比如判斷用戶是否是第一次訪問網站。目前最新的規范是RFC 6265&#xff0c;它是一個由瀏覽器服務器共同…

驍龍820和KryoCPU:異構計算與定制計算的作用 【轉】

本文轉載自&#xff1a;https://www.douban.com/group/topic/89037625/ Qualcomm驍龍820處理器專為提供創新用戶體驗的頂級移動終端而設計。為實現消費者所期望的創新&#xff0c;移動處理器必須滿足日益增長的計算需求且降低功耗&#xff0c;同時還要擁有比以往更低的溫度&…