AOP关于注解和XML配置的一些说明: https://my.oschina.net/dajianguo/blog/1143035
AspectJ切入点语法详解 http://www.procedurego.com/article/138725.html
1.通知方式
@Before 前置通知
@After 后置通知
@Around 环绕通知
@AfterThrowing 异常通知
@AfterReturning 返回通知
2.启动自动代理
@EnableAspectJAutoProxy
<aop:aspectj-autoproxy/>
3.切入点 execution(* com.sp.sp2.SgtPeppers3.play(..)
*代表任意返回值
..代表任意参数
4.向原有类注入新的方法
@DeclareParents(value=”com.sp.sp2.CompactDisc2+”,defaultImpl=DefaultAddon.class)
public Addon add;
value要注入的对象 +表示所有实现该接口的对象
defaultImpl表示要注入的方法所在实现类 Addon是要注入的方法类的接口 DefaultAddon是他的一个实现
5.XML方式
aop:before
aop:after
aop:around
aop:after-returning
aop:after-throwing
aop:aspect
aop:aspectj-autoproxy
aop:pointcut
aop:config
aop:declare-parents
方式一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
package com.pandy.framework.base.comm.interceptor;/** * Created by pandy on 16-8-27. */ import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 项目名称: workspace * 功能说明: * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 16-8-27. * 创建时间: 下午2:15. * 修改历史: * ----------------------------------------------- */ public class MonitorMethodTimeInterceptor implements MethodInterceptor { private static final Logger logger = LoggerFactory .getLogger(MonitorMethodTimeInterceptor.class); private long threshold = 10; public long getThreshold() { return threshold; } public void setThreshold(long threshold) { this.threshold = threshold; } @Override public Object invoke(MethodInvocation invocation) throws Throwable { String name = invocation.getMethod().getDeclaringClass().getName() + "." + invocation.getMethod().getName(); long start = System.currentTimeMillis(); try { return invocation.proceed(); } finally { long elapseTime = System.currentTimeMillis() - start; if (elapseTime > threshold) { StringBuilder builder = new StringBuilder(); builder.append("方法").append(name); builder.append("的执行时间超过阈值").append(threshold).append("毫秒,"); builder.append("实际执行时间为").append(elapseTime).append("毫秒.\r\n"); logger.info(builder.toString()); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<bean id="monitorMethodTimeInterceptorAdvice" class="com.pandy.framework.base.comm.interceptor.MonitorMethodTimeInterceptor"> <property name="threshold" value="200"/> </bean> <bean id="monitorMethodTimeInterceptorPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype"> <property name="patterns"> <list> <value>com.pandy..controller.*</value> <value>com.pandy..service.*</value> <value>com.pandy..manager.*</value> <value>com.pandy..dao..*</value> </list> </property> </bean> <aop:config> <aop:advisor pointcut-ref="monitorMethodTimeInterceptorPointcut" advice-ref="monitorMethodTimeInterceptorAdvice"/> </aop:config> |
方式二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<!-- 定义事务的管理者 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 定义使用事务的方法特征行为 --> <tx:attributes> <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="del*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="modify*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="set*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="make*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="proce*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="do*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="work*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException"/> <tx:method name="find*" propagation="SUPPORTS"/> <tx:method name="get*" propagation="SUPPORTS"/> <tx:method name="select*" propagation="SUPPORTS"/> <tx:method name="query*" propagation="SUPPORTS"/> <tx:method name="*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice> <!-- 配置事务切入点 --> <aop:config> <!--把事务控制在Service层--> <aop:pointcut id="bussinessService" expression="execution(* com.pandy..atomikos.service..*Service*.*(..))"/> <!-- 指定bussinessService切入点应用txAdvice处理器,即该切入点的所有符合特征的方法均具备了事务性 --> <aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice"/> </aop:config> |
方式三:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
package com.pandy.framework.core.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.Date; /** * 项目名称: wp_idea_linux * 功能说明: 在applicationContext.xml(扫描service的配置文件)配置: <aop:aspectj-autoproxy proxy-target-class="true" /> * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 15-11-13. * 创建时间: 下午9:42. * 修改历史: * ----------------------------------------------- */ @Aspect @Component public class ServiceLogAspect { private Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class); @Pointcut("within(@org.springframework.stereotype.Service *)") public void cutService(){ } @Around("cutService()") public Object recordSysLog(ProceedingJoinPoint point) throws Throwable{ if(logger.isDebugEnabled()) logger.debug("切面编程, 监控 Service 连接."); Object result = null; Date d1 = new Date(); if (point.getArgs() != null && point.getArgs().length > 0) { result = point.proceed(point.getArgs()); } else { result = point.proceed(); } Date d2 = new Date(); double s = (d2.getTime() - d1.getTime()) * 1.0 / 1000; logger.info("Service:" + s+"S"); return result; } } |