AOP Spring实现

版权声明:代码自由使用 https://blog.csdn.net/qq_33745102/article/details/79958300

AOP在Spring中的实现粒度较大,只能在方法级别上进行切面编程,足够简单。

AOP advice in Spring

Advice Range
Before 在切点方法之前执行
After 在切点方法之后执行
After-returning 切点方法成功执行之后执行
After-throwing 切点方法异常执行且抛出异常
Around After和Before建议组合

Spring AOP支持属性

  1. weaving:runtime
  2. AOP 实现方式:introduction 和对象Proxy
  3. 切面对象类型:POJO
  4. 接入点筛选方式:Pointcut筛选,通过Pointcut对参数,方法名,包中类进行切点筛选

Spring Pointcut 实现

Spring筛选切入点的方法是通过Pointcut,Pointcut的常用筛选条件(注解方式):

注解方式 描述
@args 方法参数筛选
@target 筛选被指定注解类注解的Bean
@within 筛选指定包下的类

语法实例1:

execution(** package.PaticularClass.SpecificMethod(..))

//execution是一个标记,代表筛选开始,通常这个语句写在@advice注解里
//** 代表被筛选的方法SpecificMethod返回任何类型的值
//package为包名
//PaticularClass:指定类名
//SpecificMethod:指定方法名
//注意前面提到Spring AOP的切面粒度为方法级别

语法实例2:

  execution(** package.PaticularClass.SpecificMethod(..) 
  && within(domain.*))
//在语法实例1的条件下加上只在类包domain下筛选的条件
//&&代表建议的且运算,同样可以用||,!分别代表或和非运算

语法实例3:

  execution(** package.PaticularClass.SpecificMethod.(int)
  && args(argumentname))
  //argumentname和方法签名中方法相同

现在可以搭建一个切面类:

@Aspect //注解切面类
public class Specific{

     @Before(execution(** package.PaticularClass.SpecificMethod(..) 
             && within(domain.*)))
     public void executeBeforeAdvisedMethod(){
           //do something
    }

     @After(execution(** package.PaticularClass.SpecificMethod(..) 
             && within(domain.*)))
     public void executeAfterAdvisedMethod(){
          //do something
     }
}

注意到,每个注解方法都有一个@advice类注释,用来标识切面类方法的执行时机,但是@Before@After方法需要定义相同的节点,这并不是我们想要的!可以定义一个条件对象,当需要使用这个条件对象时候,引用它,这在Spring中叫做Pointcut对象。于是我们可以改编上述代码:

@Aspect //注解切面类
public class Specific{
      //这个定义筛选对象注解,注解execute()
     @Pointcut(execution(** package.PaticularClass.SpecificMethod(..) 
             && within(domain.*))) 
     //很尴尬,这里必须加一个Mark,用来标识我们在引入注解这个方法的Pointcut条件
     public void execute(){

    }
    @Before("execute()")
     public void executeBeforeAdvisedMethod(){
           //do something
    }

    @After("execute()")
     public void executeAfterAdvisedMethod(){
          //do something
     }
}
阅读更多

扫码向博主提问

一嵩寒溪

spring带给我开发的春天
  • 擅长领域:
  • java
  • spring
  • jpa
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页