大型Java web應用
往往有很大的系統訪問量
為了保護服務器免於出現過載的情況
一般都需要對流量進行控制
對於web頁面的訪問一般通過配置服務器或者apache可以起到保護的作用
但是對於webservice
在負載均衡之外還需要一些手段來防止系統過載
這些手段需要通過服務器端編碼實現
一般地
實現這類監控一般選擇是用aop的方式
在不影響功能代碼的情況下進行
這裡spring aop是一個通常的選擇
無論通過xml配置的方式
還是使用AspectJ
spring aop都必須由開發者通過代碼形式確定織入點
對於小型webservice應用來
說
如果將一系列webservice接口放在同一的包中
那麼配置還相對簡單
但對於一個相對較大的webservice應用
他的配置將變得非常繁瑣
並且對於個性化的需求並不好處理
AspectJ定義織入點是
可以通過使用比如execution
within
target等函數聲明切入點
這些函數就不一一解釋了
這裡要說明的
是使用execution與annotation配合
實現自定義織入點的方法
方便靈活地配置需要監控的方法
先把代碼貼上來
注解定義如下
@Target({ElementType
METHOD})
@Retention(RetentionPolicy
RUNTIME)
public @interface Monitor {
String value() default
;
}
這樣就可以在目標方法上使用注解了
切面
@Aspect
public class MonitorInterceptor {
@Around(
execution(* **
*()) && @annotation(monitor)
)
public void doMonitor (ProceedingJoinPoint joinPoint
Monitor monitor) {
//業務代碼
}
}
execution(* **
*())表示執行任何方法
@annotation(monitor)表示方法上帶有Monitor注解的
當滿足這兩個條件時即時滿足條件的切入點
使用這種方式
在doMonitor方法中必須要有一個Monitor類型的入參
否則會拋出異常(試試就知道了)
如果不想使用這種方式
可以考慮使用
@Around(
execution(@Monitor * **
*())
)
接下來只要將目標webservice做為一個bean加載到spring容器中
並且配置使用aspectJ即可
如下
<?xml version=
encoding=
UTF
?><beans xmlns=
/schema/beans
xmlns:xsi=
/
/XMLSchema
instance
xmlns:context=
/schema/context
xmlns:aop=
/schema/aop
xsi:schemaLocation=
/schema/context /schema/context/spring
context
xsd
/schema/beans /schema/beans/spring
beans
xsd
/schema/aop /schema/aop/spring
aop
xsd
>
<aop:aspectj
autoproxy /></beans>
測試類
public class Test {
@Monitor
public void test {
//業務代碼
}
}
只要將Test類配置入spring就能發現
aop生效了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25552.html