AOP的原理和例項
AOP的原理
對哪些物件在什麼位置攔截做什麼 <=> <aop:before method="before" pointcut-ref="txPointcut" />
哪些物件
<!-- 定義切面,所有的service的所有方法 -->
<aop:pointcut id="txPointcut" expression="execution(* com.masterslave.service.*.*(..))" />
dataSourceAspect 是切面要攔截什麼。aop:before就是在攔截物件的前面位置。method="before"就是使用切面中的方法處理攔截
85 <aop:aspect ref="dataSourceAspect" order="-9999">
86 <aop:before method="before" pointcut-ref="txPointcut" />
87 </aop:aspect>
如上是用配置檔案配置的
還有方法是直接用註解方式
註解中也說明了,攔截範圍@Pointcut,在什麼位置@Before,做什麼@Aspect,具體攔截物件是誰JoinPoint
@Aspect
public class LoggingAspect {
// @Pointcut("execution(* com.samsung.sdsc.legal..*Impl.*(..)) || execution(* com.samsung.sdsc.legal..*Action.*(..))")
@Pointcut("execution(* com.samsung.sdsc.legal..*Impl.*(..))")
public void serviceMethod() {
}
@Before("serviceMethod()")
public void beforeLogging(JoinPoint thisJoinPoint) {
Class<? extends Object> clazz = thisJoinPoint.getTarget().getClass();
Logger logger = Logger.getLogger(clazz);
String methodName = thisJoinPoint.getSignature().getName();
Object[] arguments = thisJoinPoint.getArgs();
StringBuffer argBuf = new StringBuffer();
StringBuffer argValueBuf = new StringBuffer();
int i = 0;
for (Object argument : arguments) {
String argClassName = "";
if (null == argument) {
argClassName = "Null";
argument = "";
} else {
argClassName = argument.getClass().getSimpleName();
}
if (i > 0) {
argBuf.append(", ");
}
argBuf.append(argClassName + " arg" + ++i);
argValueBuf.append(".arg" + i + " : " + argument.toString() + "\n");
}
if (i == 0) {
argValueBuf.append("No arguments\n");
}
StringBuffer messageBuf = new StringBuffer();
messageBuf.append("before executing " + methodName + "("
+ argBuf.toString() + ") method");
messageBuf
.append("\n-------------------------------------------------------------------------------\n");
messageBuf.append(argValueBuf.toString());
messageBuf
.append("-------------------------------------------------------------------------------");
logger.info(messageBuf);
}
}
對哪些物件在什麼位置攔截做什麼 <=> <aop:before method="before" pointcut-ref="txPointcut" />
哪些物件
<!-- 定義切面,所有的service的所有方法 -->
<aop:pointcut id="txPointcut" expression="execution(* com.masterslave.service.*.*(..))" />
dataSourceAspect 是切面要攔截什麼。aop:before就是在攔截物件的前面位置。method="before"就是使用切面中的方法處理攔截
85 <aop:aspect ref="dataSourceAspect" order="-9999">
86 <aop:before method="before" pointcut-ref="txPointcut" />
87 </aop:aspect>
如上是用配置檔案配置的
還有方法是直接用註解方式
註解中也說明了,攔截範圍@Pointcut,在什麼位置@Before,做什麼@Aspect,具體攔截物件是誰JoinPoint
@Aspect
public class LoggingAspect {
// @Pointcut("execution(* com.samsung.sdsc.legal..*Impl.*(..)) || execution(* com.samsung.sdsc.legal..*Action.*(..))")
@Pointcut("execution(* com.samsung.sdsc.legal..*Impl.*(..))")
public void serviceMethod() {
}
@Before("serviceMethod()")
public void beforeLogging(JoinPoint thisJoinPoint) {
Class<? extends Object> clazz = thisJoinPoint.getTarget().getClass();
Logger logger = Logger.getLogger(clazz);
String methodName = thisJoinPoint.getSignature().getName();
Object[] arguments = thisJoinPoint.getArgs();
StringBuffer argBuf = new StringBuffer();
StringBuffer argValueBuf = new StringBuffer();
int i = 0;
for (Object argument : arguments) {
String argClassName = "";
if (null == argument) {
argClassName = "Null";
argument = "";
} else {
argClassName = argument.getClass().getSimpleName();
}
if (i > 0) {
argBuf.append(", ");
}
argBuf.append(argClassName + " arg" + ++i);
argValueBuf.append(".arg" + i + " : " + argument.toString() + "\n");
}
if (i == 0) {
argValueBuf.append("No arguments\n");
}
StringBuffer messageBuf = new StringBuffer();
messageBuf.append("before executing " + methodName + "("
+ argBuf.toString() + ") method");
messageBuf
.append("\n-------------------------------------------------------------------------------\n");
messageBuf.append(argValueBuf.toString());
messageBuf
.append("-------------------------------------------------------------------------------");
logger.info(messageBuf);
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750077/viewspace-2143165/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Exchanger的工作原理及例項
- NIO原理及例項
- ruby中的類例項變數和例項的例項變數變數
- 移動端下拉重新整理原理和例項
- pr劫持的原理及操作例項、pr劫持的原理
- java Spring框架IOC和AOP的實現原理JavaSpring框架
- Android探索之旅 | AIDL原理和例項講解AndroidAI
- 例項和物件物件
- 類和例項
- 例項詳解貝葉斯推理的原理
- [機器學習]協同過濾演算法的原理和基於Spark 例項機器學習演算法Spark
- SpringCloud——Feign例項及原理SpringGCCloud
- TRIZ 機械振動原理 例項
- Spring事務管理與AOP代理的原理,預設的單例物件和代理物件銷燬的時機Spring單例物件
- Spring AOP的實現原理Spring
- 2 Day DBA-管理Oracle例項-Oracle例項和例項管理概覽Oracle
- 詳解 AWS 的突發效能例項:CPU 和頻寬突發的工作原理
- C++ 結構體例項和類例項的初始化C++結構體
- Java 下 SSL 通訊原理及例項Java
- CSS動畫學習指南:原理與例項CSS動畫
- 網路測速一原理及例項
- JS中排序的用法和例項JS排序
- vue例項的屬性和方法Vue
- javascript閉包的理解和例項JavaScript
- python 類和例項Python
- $$和||使用程式碼例項
- 資料庫和例項資料庫
- EntityFramework Core上下文例項池原理分析Framework
- CGroup 介紹、應用例項及原理描述
- 2 Day DBA-管理Oracle例項-關於例項的啟動和關閉-關於例項關閉Oracle
- 2 Day DBA-管理Oracle例項-關於例項的啟動和關閉-關於例項啟動Oracle
- php例項化物件的例項方法PHP物件
- 類的例項化順序和分析
- php和json的應用例項PHPJSON
- jQuery的ajax和json使用例項jQueryJSON
- Excel isna函式的用法和例項Excel函式
- 觸發器的語法和例項觸發器
- Oracle例項的啟動和關閉Oracle