一,Spring框架的特点1 :AOP
1, AOP全称: Aspect Oriented Programming
2, AOP主要是用面向切面编程思想处理问题,面向切面编程是对面向对象编程的补充和延续
3,面向切面编程思想
面向切面编程思想是将我们程序中的非业务代码(提交事务,打印日志,权限验证,统一的异常处理,等等)提取分离出来,然后在调用业务代码时,通过一个代理对象帮助我们调用这些提取出来的非业务代码,这样在业务代码不用显示的调用非业务代码,做到的业务代码和非业务代码的分离,降低了耦合度
4,核心原理:
使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑
好处:模块之间的耦合度降低了
原理:动态代理模式 给业务代码生成代理对象
AOP 编程思想是Java中的,不是Spring专有的,是Spring使用AOP这一编程思想
5,使用案例:
事务处理:开启事务,关闭事务,出现异常后回滚事务
权限判断:在执行方法前,判断是否具有权限
日志:在执行前进行日志处理
二,AOP的基本概念
连接点(Joinpoint):类中可以被增强(加功能)的方法,这个方法就被称为连接点
切入点(pointcut):类类中实际被增强的方法(实际实现的连接点)
通知(Advice):
通知是指一个切面在特定的连接点要做的事情(增强的功能)。通
知分为方法执行前通知,方法执行后通知,环绕通知等
目标(Target):代理的目标类(连接点和切入点所在的类)
代理(Proxy):向目标对象 应用通知时 创建的代理对象
三,关于spring框架中的 AOP 的实现
对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,
可以完成面向切面编程。
AspectJ 是一个基于 Java 语言的 AOP 框架,它提供了强大的 AOP 功能,且其实
现方式更为简捷,使用更为方便, 而且还支持注解式开发。所以,Spring 又
将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。
1,第一步 下载 AOP 相关 jar
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2,第二步基于注解方式实现
启动 AspectJ 支持:<aop:aspectj-autoproxy />
<aop:aspectj-autoproxy />
在Spring.xml文件中添加自动代理
四,AspectJ 中常用的通知有五种类型:
前置通知,后置通知,环绕通知,异常通知,返回通知.
@Before 前置通知:方法执行之前
@After 后置通知:方法执行之后,无论是否出现异常
@AfterReturnning 返回通知:方法成功执行之后通知,出现异常不执行
@AfterThrowing 异常通知:抛出异常之后通知
@Around 环绕通知:方法执行前后都有通知
实例:
定义通知:
@Component
@Aspect
public class AOPDemo {
@Before("execution(* com.ff.spring.dao.UserDao.*(..))")
public void saveLog(){
System.out.println("saveLog");
}
@AfterThrowing(value = "execution(*com.ff.spring.dao.UserDao.*(..))",throwing = "e")
public void afterthrow(Throwable e){
System.out.println("afterthrow");
}
public void aroundAdvice(ProceedingJoinPoint joinPoint){
try {
//前置通知
Object[] objects = joinPoint.getArgs();
joinPoint.proceed();//调用我们自己的目标方法
//返回通知
} catch (Throwable throwable) {
throwable.printStackTrace();
//异常通知
}
//后置通知
}
}