Spring AOP实现方式


什么是AOP

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方
式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个
热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑
的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高
了开发的效率。
编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面。

实现方式一,主要实现Spring的api接口

applicationcontext.xml

<?xml version="1.0" encoding="UTF-8"?>


    
    
    
    
    
    

    
        
        
        
        
        
    


切入的内容

放切入点前

package com.liu.log;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class Log  implements MethodBeforeAdvice {

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
//method:被调用的方法
//args:方法的参数
//target:方法调用的目标。可能为空
        System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行了");

    }
}

放在切入点后

package com.liu.log;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class AfterLog implements AfterReturningAdvice {
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
//returnValue 返回结果
//method:     被调用的方法
//args:      方法的参数
//target:     方法调用的目标。可能为空
        System.out.println("执行完了"+method.getName()+"返回结果为"+returnValue);
    }
}

一个接口一个实现

实现方式二 主要切面定义

增加放在切入点前后的方法

public class DiyPioncut {
    public void before(){System.out.println("============切入点前================");}
    public void after(){System.out.println("============切入点后================");}
}

配置applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

    
    
    
    
    
    
    


    
    
        
            
        
            
        
    

execution表达式

execution(* com.loongshawn.method.ces..*.*(..))
标识符 含义
execution() 表达式的主体
第一个“*”符号 表示返回值的类型任意
com.loongshawn.method.ces AOP所切的服务的包名,即,需要进行横切的业务类
包名后面的“..” 表示当前包及子包
第二个“*” 表示类名,*即所有类
.*(..) 表示任何方法名,括号表示参数,两个点表示任何参数类型

实现方式三 注解实现

xml文件开启注解扫描和支持注解

    
    
    
  
    


    
    
    
    

切面类进行bean注册和切点确认

package com.liu.annnoPoincut;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
//标记这个类是一个切面
public class AnnoPoincut {

    @Before("execution(* com.liu.service.UserServiceImpl.*(..))")
    public void before() {
        System.out.println("---------------执行前");
    }

    @After("execution(* com.liu.service.UserServiceImpl.*(..))")
    public void after() {
        System.out.println("---------------执行后");
    }

}