Spring–添加AOP支持

我聽到了一個有關一位高級(且酬勞頗豐)軟件工程師的故事。 他的任務是記錄他正在研究的項目中每個控制器中的每個方法。 工程師重寫了所有控制器方法,因此使用如下代碼:
@RequestMapping(method = RequestMethod.GET)public String showEmployees(Model model) {List<Employee> employees = employeeDao.list();model.addAttribute('employees', employees);return 'employees/list';}

他編寫了以下代碼:

@RequestMapping(method = RequestMethod.GET)public String showEmployees(Model model) {LOGGER.log('Invoking method showEmployees');List<Employee> employees = employeeDao.list();model.addAttribute('employees', employees);LOGGER.log('Returning from method showEmployees');return 'employees/list';}

此代碼有什么問題? 好:

  • 用這樣的代碼更改每種方法都需要花費大量時間
  • 容易出錯-您可以輸入錯別字或忘記在某處添加日志記錄
  • 這是各方面關注的問題 。 這意味著您要在不屬于其的地方添加相同的重復性,樣板代碼和無關的代碼。
  • 例如,showEmployees方法的職責是什么? 它正在調用服務,招募員工并將其建模。 記錄確實不是責任,那么為什么要混合這些顧慮?

    如果我提到的工程師了解面向方面的編程,那么他將節省大量時間,并使代碼更好,更易讀。 Spring支持專門針對此類問題的“方面”。 方面使我們可以在一處定義通用功能。 在我們編寫任何代碼之前,需要了解一些術語。 這個術語非常龐大,我將不在這里寫,但如果您希望了解更多信息,我鼓勵您閱讀AOP上Spring的官方參考頁 。 您至少應該了解什么是建議,連接點,切入點,縱橫比和編織。

    好吧,讓我們添加Aspect來記錄控制器方法,這正是從一開始就應該做的工程師工作。

    我們必須首先在AspectJ庫上將依賴項添加到pom.xml

    <dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.6.11</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjtools</artifactId><version>1.6.11</version></dependency>

    還要檢查您是否依賴于Spring的AOP(但是如果您從一開始就遵循本教程,則已經擁有它):

    <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>3.1.0.RELEASE</version></dependency>

    現在讓我們編寫Aspect的代碼。 創建包org.timesheet。 方面并添加ControllerLoggingAspect類:

    package org.timesheet.aspects;import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;import java.util.Arrays;/*** Will log every invokation of @RequestMapping annotated methods* in @Controller annotated beans.*/
    @Aspect
    public class ControllerLoggingAspect {@Pointcut('within(@org.springframework.stereotype.Controller *)')public void controller() {}@Pointcut('execution(* *(..))')public void methodPointcut() {}@Pointcut('within(@org.springframework.web.bind.annotation.RequestMapping *)')public void requestMapping() {}@Before('controller() && methodPointcut() && requestMapping()')public void aroundControllerMethod(JoinPoint joinPoint) throws Throwable {System.out.println('Invoked: ' + niceName(joinPoint));}@AfterReturning('controller() && methodPointcut() && requestMapping()')public void afterControllerMethod(JoinPoint joinPoint) {System.out.println('Finished: ' + niceName(joinPoint));}private String niceName(JoinPoint joinPoint) {return joinPoint.getTarget().getClass()+ '#' + joinPoint.getSignature().getName()+ '\n\targs:' + Arrays.toString(joinPoint.getArgs());}}

    這段代碼說,控制器方法中的@Before和@AfterReturning我們將記錄有關其調用的信息(名稱和參數)。 當所有三個切入點都匹配時,將執行此建議。 controller()切入點標記了應在其上編織建議的匹配連接點(與構造型Controller匹配)。 methodPointcut()標記我們正在處理方法調用,而requestMapping() 點標記使用@RequestMapping注釋的方法。

    為了使其工作,我們將在src / main / resources下添加aop.xml Spring配置文件:

    <?xml version='1.0' encoding='UTF-8'?>
    <beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:aop='http://www.springframework.org/schema/aop'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd'><!-- AOP support --><bean id='controllerAspect' class='org.timesheet.aspects.ControllerLoggingAspect' /><aop:aspectj-autoproxy><aop:include name='controllerAspect' /></aop:aspectj-autoproxy></beans>

    然后,將其導入timesheet-servlet.xml Spring配置中:

    <import resource='classpath:aop.xml' />

    這是教程的最后一部分。 我希望您現在對Spring是什么以及它如何幫助解決您的問題有更好的了解。 請記住,在本教程中我們僅涵蓋了Spring的一小部分。 還有更多值得探索的地方!

    參考: 第6部分–在vrtoonjava博客上從我們的JCG合作伙伴 Michal Vrtiak 添加AOP支持 。


翻譯自: https://www.javacodegeeks.com/2012/09/spring-adding-aop-support.html

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

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

相關文章

vscode python第三方庫檢測_VSCode中使用Pylint檢查python代碼

為什么使用lint在日常開發中&#xff0c;不同開發人員會寫下不同風格的代碼&#xff0c;導致代碼可維護性變差&#xff0c;為了解決風格不一致問題&#xff0c;我們可以制定代碼規范&#xff0c;讓開發人員都遵守同樣的規范編寫代碼。在開發過程中&#xff0c;部分代碼存在質量…

Spring MVC-集成(Integration)-集成LOG4J示例(轉載實踐)

以下內容翻譯自&#xff1a;https://www.tutorialspoint.com/springmvc/springmvc_log4j.htm 說明&#xff1a;示例基于Spring MVC 4.1.6。 以下示例說明如何使用Spring Web MVC框架來觸發LOG4J。首先&#xff0c;讓我們使用Eclipse IDE&#xff0c;并按照以下步驟使用Spring W…

NUMA架構和Java

是時候部署您的應用程序了&#xff0c;期待著采購最適合負載要求的硬件。 如今&#xff0c;具有40核或80核的包裝盒非常普遍。 總體概念是更多的內核&#xff0c;更多的處理能力&#xff0c;更多的吞吐量。 但是我看到了一些相反的結果&#xff0c;表明小型的CPU密集型測試運行…

存儲過程常用技巧

我們在進行pl/sql編程時打交道最多的就是存儲過程了。存儲過程的結構是非常的簡單的&#xff0c;我們在這里除了學習存儲過程的基本結構外&#xff0c;還會學習編寫存儲過程時相關的一些實用的知識。如&#xff1a;游標的處理&#xff0c;異常的處理&#xff0c;集合的選擇等等…

vue是用a標簽打開新頁面_vue 在新窗口打開頁面并設置不同的背景

開發一個新系統&#xff0c;前端用的vue&#xff0c;vue是單體應用&#xff0c;所有頁面都在一個窗口里實現&#xff0c;但項目要求在點button鏈接后要新打開一個瀏覽器頁面&#xff0c;解決方法如下&#xff1a;1. 給此button設置新事件 click"createdefect"提交缺陷…

卡爾曼濾波的推導

卡爾曼濾波的推導1 最小二乘法在一個線性系統中&#xff0c;若\(x\)為常量&#xff0c;是我們要估計的量&#xff0c;關于\(x\)的觀測方程如下&#xff1a; \[ y Hx v \tag{1.1}\] \(H\)是觀測矩陣&#xff08;或者說算符&#xff09;&#xff0c;\(v\)是噪音&#xff0c;\(y…

Java注釋-保留

考慮一下Java批注&#xff1a; public interface AnAnnotaton {}帶有此注釋的類&#xff1a; AnAnnotaton class AnAnnotatedClass{}還有一個測試&#xff0c;檢查類中是否存在此批注&#xff1a; import static org.hamcrest.MatcherAssert.assertThat; import static org.h…

MYSQL查詢選修三門以上課程_SQL高級查詢的練習題

Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname,T#) 課程表SC(S#,C#,score) 成績表Teacher(T#,Tname) 教師表問題&#xff1a;1、查詢“001”課程比“002”課程成績高的所有學生的學號&#xff1b;select a.S# from (select s#,score from SC where C#001) a,(select s#,s…

Determing client's IP

AuthorDeterming clients IPАнатоли&23.04.2009 18:39:46Registered userHow to determine clients IP address in THTTPServer.OnClientConnected, THTTPServer.OnClientDisonnected and TRtcFunction.OnExecute events?Danijel Tkalcec [RTC]23.04.2009 19:45:05…

mysql aa復制_MySQL的復制架構與優化

MySQL的復制架構與優化###########原理###########1.主服務器將更新的數據的sql語句(例如&#xff0c;insert&#xff0c;update&#xff0c;delete等)寫入到二進制文件中(由log-bin選項開啟)。此二進制文件由一個索引文件跟蹤維護。2.從服務器連接(使用I/O線程連接)主服務器&a…

如何安裝Gradle

Gradle是一個簡單而強大的構建工具。 它類似于Ant構建工具。 它可以很好地管理構建&#xff0c;還可以處理構建依賴性。 Gradle最好的部分是它是開源項目。 如果您正在考慮安裝并嘗試一下&#xff0c;那么您來對地方了。 Gradle的開發周期為4周&#xff0c;因此&#xff0c;每隔…

nmap使用指南

一、目標指定 1.CIDR標志位 192.168.1.0/24 2.指定范圍 192.168.1.1-255 192.168.1-255.1&#xff08;任意位置&#xff09;3.IPv6地址只能用規范的IPv6地址或主機名指定。 CIDR 和八位字節范圍不支持IPv6&#xff0c;因為它們對于IPv6幾乎沒什么用。 -iL <文件名> 主機名…

#Pragma Pack(n)與內存分配

#pragma pack(n) 解釋一&#xff1a; 每個特定平臺上的編譯器都有自己的默認“對齊系數”(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n)&#xff0c;n1,2,4,8,16來改變這一系數&#xff0c;其中的n就是你要指定的“對齊系數”。 規則&#xff1a; 1、數據成員對齊規…

Java死了還是無敵?

作家艾薩克阿西莫夫&#xff08;Isaac Asimov&#xff09;曾經說過“唯一不變的就是變化”。 這不僅僅是軟件行業中的一個短語&#xff0c;這是絕對的事實。 曾經有一天&#xff0c;Corba為王&#xff0c;但Web Services篡奪了它。 即使在Web服務領域&#xff0c;過去也全都是關…

mysql數據庫訪問問題嗎_#MySQL數據庫無法遠程訪問的問題

在 Ubuntu上裝了mysql&#xff0c;因為項目的數據庫是mysql&#xff0c;將項目放在tomcat里面webapp下面&#xff0c;一直啟動不成功。本來一直以為是jdbc驅動問題&#xff0c;后來發現不是。1.cd /etc/mysql 找到my.cnf查找到bind-address&#xff0c;將 bind-address127.0.0.…

SolidEdge如何復制特征 建立類似于UG 塊的概念

直接CtrlC和CtrlV可以實現特征的復制粘貼 按N鍵可以改變特征方向 已經復制完成的特征要進行定位&#xff0c;則右擊該特征&#xff0c;編輯輪廓&#xff0c;可以進行聰慧尺寸的標注 使用特征庫的方式&#xff0c;就像UG的塊一樣&#xff0c;可以給所有零件調用。在任意位置新建…

Gradle自定義插件

本教程介紹了創建Gradle獨立自定義插件的方法。 它涵蓋以下主題 創建任務&#xff0c;并在“自定義”插件中使用它 獨立的自定義插件 簡短的插件ID 使用settings.gradle自定義Gradle設置 項目信息&#xff1a; 搖籃版本&#xff1a;1.1 操作系統平臺&#xff1a;Ubuntu 1…

mysql映射文件_Mybatis SQL映射文件

簡單查詢insert添加insert可以使用數據庫支持的自動生成主鍵策略&#xff0c;設置useGeneratedKeys”true”&#xff0c;然后把keyProperty 設成對應的列&#xff0c;就搞定了。比如說上面的StudentEntity 使用auto-generated 為id 列生成主鍵.還可以使用selectKey元素。下面例…

監聽微信、支付寶等移動app及瀏覽器的返回、后退、上一頁按鈕的事件方法

在實際的應用中&#xff0c;我們常常需要實現在移動app和瀏覽器中點擊返回、后退、上一頁等按鈕實現自己的關閉頁面、調整到指定頁面或執行一些其它操作的 需求&#xff0c;那在代碼中怎樣監聽當點擊微信、支付寶、百度糯米、百度錢包等app的返回按鈕或者瀏覽器的上一頁或后退按…

第七天作業

---恢復內容開始--- 作業一&#xff1a;nginx服務 二進制安裝nginx包 作為web服務修改配置文件 讓配置生效&#xff0c;驗證配置 直至出現epel的兩個文件&#xff0c;否則reinstall, 接下來寫配置文件&#xff0c; 這款軟件的服務目錄&#xff0c; 在里面編輯一些東西&#xff…