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 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方法上。


以上是关于service层AOP(基于注解的方法切入)的主要内容,如果未能解决你的问题,请参考以下文章

AspectJ注解

基于@Aspect注解编程(重点)

利用Cglib实现AOP

阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

AOP实现日志打印 基于xml配置的AOP实现 切入点表达式

框架 day37 Spring3,AOP,代理模式(动态/CGLIB/工厂bean),传统AOP,AspectJ框架(基于xml/注解),切入点表达式,jdbcTemplate