service层AOP(基于注解的方法切入)
Posted 星力量
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了service层AOP(基于注解的方法切入)相关的知识,希望对你有一定的参考价值。
service层AOP(基于注解的方法切入)
一、导入Maven依赖包
<!-- AOP Pointcut --><dependency><groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>二、spring 配置文件
<!-- 启动对@AspectJ注解的支持 --> <aop:aspectj-autoproxy/> <aop:aspectj-autoproxy proxy-target-class="true" />三、编写注解类 @interface ServiceAopAnn
import java.lang.annotation.*; @Target(ElementType.PARAMETER, ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ServiceAopAnno String value() default ""; boolean required() default true;四、编写AOP切面处理类 ServiceAspect 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.springframework.stereotype.Component;import org.slf4j.Logger; import org.slf4j.LoggerFactory;@Aspect@Componentpublic class ServiceAspectprotected Logger logger = LoggerFactory.getLogger(this.getClass()); //Service层切点 @Pointcut("@annotation(ServiceAopAnno)") public void serviceAspect() @Around("serviceAspect()") public void doAround(ProceedingJoinPoint joinPoint) throws Throwable Object target = joinPoint.getTarget(); Object[] args = joinPoint.getArgs(); if(logger.isDebugEnabled()) logger.debug("doAround_begin: target: ,args: " ,target ,args);
//TODO do something before proceed
//do target.method try Object obj = joinPoint.proceed(); catch (Throwable e) logger.error("doAround_proceed error:" + e.getMessage() , e); throw e;
//TODO do something after proceed
if(logger.isDebugEnabled()) logger.debug("doAround_end: target: ,args: " ,target ,args);五、service实现类添加AOP切面注解@Service("messageService") public class MessageServiceImpl implements MessageService
六、注意事项 1. 确认你的bean 是AopProxy代理的对象:AopUtils.isAopProxy()//
AopUtils.isCglibProxy() //cglib
AopUtils.isJdkDynamicProxy() //jdk动态代理
2. context:component-scan 重复扫描(bean实例化多次)可能影响事务;
3. 基于类的代理而非接口,如果想代理父类的方法,可以用 execution(* com.sishuok.es..service..*+.*(..))4. 切面只能添加到public方法上。
以上是关于service层AOP(基于注解的方法切入)的主要内容,如果未能解决你的问题,请参考以下文章
阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置
AOP实现日志打印 基于xml配置的AOP实现 切入点表达式
框架 day37 Spring3,AOP,代理模式(动态/CGLIB/工厂bean),传统AOP,AspectJ框架(基于xml/注解),切入点表达式,jdbcTemplate