不说了,有人比我写的好
查看链接:http://blog.youkuaiyun.com/moreevan/article/details/11977115
我觉得主要的还是要清楚应用场景:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
写一个自己的例子吧
这是一个使用AOP记录日志信息的例子:
下面是日志类:
package com.webService.util;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class LogNote {
private final Logger logger = Logger.getLogger(LogNote.class);
//有参无返回值的方法
public void logArg(JoinPoint point) {
//此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
Object[] args = point.getArgs();
System.out.println("目标参数列表:");
if (args != null) {
for (Object obj : args) {
System.out.println(obj + ",");
}
System.out.println();
}
}
//有参并有返回值的方法
public void logArgAndReturn(JoinPoint point, Object returnObj) {
Object[] args = point.getArgs();
StringBuffer paras=new StringBuffer();
paras.append("\nPARAMETERS :\n");
if (args != null) {
for (Object obj : args) {
try {
if (obj instanceof java.lang.String) {
paras.append("\t"+obj+"\n");
}else {
paras.append("\t"+new ReflectionToStringBuilder(obj,ToStringStyle.SHORT_PREFIX_STYLE).toString() + "\n");
}
} catch (Exception e) {
paras.append("\t"+obj+"\n");
}
}
paras.append("RETURN : "+returnObj);
logger.info(paras.toString());
}
}
public Object logAround(ProceedingJoinPoint pjp) throws Throwable {
String className = pjp.getTarget().getClass().getSimpleName();
String methodName = pjp.getSignature().getName();
StringBuffer sb = new StringBuffer();
sb.append(" className: " + className);
sb.append(" methodName: " + methodName);
logger.info(sb.toString());
Object obj = pjp.proceed();
return obj;
}
public void logException(Throwable e){
logger.warn(getClass(), e);
e.printStackTrace();
}
}
applicationContext.xml 配置文件
<!-- 日志记录 -->
<bean id="lognote" class="com.webService.util.LogNote"></bean>
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="execution(* com.webService.servers.EdbImple.*(..))" id="edbPointcut" />
<!-- 切面: 将哪个对象中的哪个方法,织入到哪个切入点 -->
<aop:aspect id="cut" ref="lognote">
<aop:after-returning method="logArgAndReturn" returning="returnObj" pointcut-ref="edbPointcut"/>
<aop:around method="logAround" pointcut-ref="edbPointcut" />
<aop:after-throwing method="logException" pointcut-ref="edbPointcut" throwing="e"/>
</aop:aspect>
</aop:config>