Spring AOP
什么是AOP:
AOP是把对象或固定的流程"切开"找到其中的公共行为,并将其提取同意处理的同一种思想。AOP可以认为是对OOP(面向对象编程)的一种补充,这种横向式的编程方式更容易处理不同对象,不同模块之间的共同业务,如访问控制,事务控制,性能监测等。
AOP依赖动态代理实现的
在代理模式中可以为原对象设置一个代理对象,被代理的对象也可称为目标对象。代理对象为目标对象方法提供一个代理方法。在这种模式下,给编程人员的感觉是在原有代码乃至原业务流程都不修改的情况下,直接在业务流程中切入新代码,增加新功能,这就是AOP。
AOP基本概念:
切入点详解:
通知类型:
- 前置通知: 在目标方法执行之前,执行前置通知
- 后置通知: 在目标方法执行之后,执行后置通知
- 异常通知: 在目标方法执行并抛出异常时,执行异常通知
- 最终通知: 在目标方法执行之后或抛出异常时,执行最终通知
- 环绕通知: 在前置通知和目标方法之前,以及最终通知之前执行环绕通知
SpringAOP在项目中的运用:
实现AOP的方式有两种一种是通过配置文件方式实现,一种是注解方式实现。
配置文件方式:
第1步: 添加jar包
Spring基本jar+AOP相关jar
第2步: 编写切面类
第3步: 编写Spring配置文件
a.将切面类交给Spring管理
b.配置面向切面
第4步: 编写程序,测试
已保存用户为例
建立UserDao接口 以及实现类:
public interface UserDao {
public int addUser(User user);
}
@Repository("userDao")//把该Bean交给Spring容器管理,即在配置文件中注册该类Id值为userDao
public class UserDaoImpl implements UserDao {
@Override
public int addUser(User user) {
System.out.println("添加成功");
return 1;
}
}
编写业务接口以及实现类
public interface UserService {
public int addUser(User user);
}
@Service("userService")//把该Bean交给Spring容器管理,即在配置文件中注册该类Id值为userService
public class UserServiceImpl implements UserService {
@Resource(name = "userDao")
private UserDao dao;
@Override
public int addUser(User user) {
return dao.addUser(user);
}
}
编写切面类:
package aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
//切面类
@Component //把该Bean交给Spring容器管理,即在配置文件中注册切面类Id值为类名首字面小写myAOP
public class MyAOP {
//定义前置通知
public void before(JoinPoint jp){
System.out.println("调用:"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法,方法入参:"+ Arrays.toString(jp.getArgs()));
}
//定义后置通知
public void afterReturning(JoinPoint jp,Object resultData){
System.out.println("调用:"+jp.getTarget()+"的"+jp.getSignature