AOP
在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
AOP核心概念
1、橫切關注點
對哪些方法進行攔截,攔截后怎么處理,這些關注點稱之為橫切關注點
2、切面(aspect)
類是對物體特征的抽象,切面就是對橫切關注點的抽象
3、連接點(joinpoint)
被攔截到的點,因為Spring只支持方法類型的連接點,所以在Spring中連接點指的就是被攔截到的方法,實際上連接點還可以是字段或者構造器
4、切入點(pointcut)
對連接點進行攔截的定義
5、通知(advice)
所謂通知指的就是指攔截到連接點之后要執行的代碼,通知分為前置、后置、異常、最終、環繞通知五類
6、目標對象
代理的目標對象
7、織入(weave)
將切面應用到目標對象並導致代理對象創建的過程
8、引入(introduction)
在不修改代碼的前提下,引入可以在運行期為類動態地添加一些方法或字段
對joinpointjin進行log日志的監控,攔截到controller ,service 等想要攔截的方法的日志輸出 ,可以輸出方法 名字與參數
首先需要拿一個SSM的項目demo來測試,這個不會的先別看了
項目的大致結構:

第一步:配置log的Maven依賴

第二步:配置log4j.properties,我是使用 properties文件的形式來配置的 還可以.XML的形式設置

簡單看一下properties其中一些配置的說明
1 輸出級別的種類
- ERROR 為嚴重錯誤 主要是程序的錯誤
- WARN 為一般警告,比如session丟失
- INFO 為一般要顯示的信息,比如登錄登出
- DEBUG 為程序的調試信息
2 配置日志信息輸出目的地
log4j.appender.appenderName=??
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
- org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
3 配置日志信息的格式
log4j.appender.appenderName.layout = ??
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以靈活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
4 ConsoleAppender選項
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
Target=System.err:默認情況下是System.out,指定輸出控制台
5 FileAppender 選項
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
6 RollingFileAppender 選項
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以產生的滾動文件的最大數。
7 日志信息格式中幾個符號所代表的含義
-X號: X信息輸出時左對齊;
%p: 輸出日志信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%r: 輸出自應用啟動到輸出該log信息耗費的毫秒數
%c: 輸出日志信息所屬的類目,通常就是所在類的全名
%t: 輸出產生該日志事件的線程名
%l: 輸出日志事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main (TestLog4.java:10)
%x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。
%%: 輸出一個”%”字符
%F: 輸出日志消息產生時所在的文件名稱
%L: 輸出代碼中的行號
%m: 輸出代碼中指定的消息,產生的日志具體信息
%n: 輸出一個回車換行符,Windows平台為”\r\n”,Unix平台為”\n”輸出日志信息換行
引用博客地址:http://blog.csdn.net/foreverling/article/details/51385128
第三步:在web.xml中配置log4j.properties

第四步:引入aspectj的依賴

第五步:配置Spring-MVC.xml 的AOP配置
這里只是簡單的列出controller的,service可以在Spring層配置 這個想要知道為什么分開的可以看我之前的一篇博客 關於兩者的區別

第六步:寫一個類專門用於管理log輸出格式的
可以根據自己的喜好和項目的需求設置

JoinPoint 對象
JoinPoint對象封裝了SpringAop中切面方法的信息,在切面方法中添加JoinPoint參數,就可以獲取到封裝了該方法信息的JoinPoint對象.
常用api:
| 方法名 | 功能 |
|---|---|
| Signature getSignature(); | 獲取封裝了署名信息的對象,在該對象中可以獲取到目標方法名,所屬類的Class等信息 |
| Object[] getArgs(); | 獲取傳入目標方法的參數對象 |
| Object getTarget(); | 獲取被代理的對象 |
| Object getThis(); | 獲取代理對象 |
OK這樣日志的一套配置流程就這樣,還有其他的形式很多,如注解形式,很多,本人初入來點小結,其實事物也可以如此形式改造,同理
【版本聲明】本文為博主原創文章,轉載請注明出處
