service层AOP(基于注解的方法切入)

来源:互联网 发布:exe软件汉化工具 编辑:程序博客网 时间:2024/04/30 02:54

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)@Documentedpublic  @interface ServiceAopAnno {    String value()  default "";    boolean required() default true;}  

四、编写AOP切面处理类 ServiceAspectimport 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 ServiceAspect {
    protected 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方法上。


0 0
原创粉丝点击