一、Spring AOP
面向切面编程(AOP),是软件编程思想发展到一定阶段的产物,是对面向对象编程(OOP)的有益补充。AOP一般适用于具有横切逻辑的场合,如访问控制、事务管理、性能监测等。面向切面编程,简单的说,就是在不改变源程序的基础上为代码段增加新的功能,对代码进行增强处理,它的设计思想来源于代理设计模式。
了解之后需要知道以下概念:
1.增强类型(Advice,有的翻译为通知,个人感觉不太好理解):
前置增强(通知),在在原方法执行之前进行处理,同理还有后置增强、环绕增强、异常抛出增强、最终增强等。
2.连接点(Joinpoint):
程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后等。连接点由两个信息确定:方法表示的程序执行点;相对点表示的方位。
3.切点(Pointcut):
每个类都拥有多个连接点:类的所有方法实际上都是连接点,即连接点是程序类中客观存在的事务。AOP 通过切点定位到特定的连接点。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。
下面编写一个HelloWorld:
需求:
在Student类中有一个说话的say方法,需要使用AOP对此方法进行增强处理。
package com.wzj.entity;
public class Student {
private int id;
private String name;
//省略get、set方法
public void say(){
System.out.println("大家好,我的名字叫:"+getName());
}
}
二、基于注解的方式实现spring aop增强
步骤:1.创建普通的java项目,加入jar包(在上文中有jar包的下载地址),创建好spring-config.xml文件,另外还要导入AspectJ框架所需jar包:aspectjweaver.jar、aopalliance.jar,可以百度下载
2.创建一个增强类如:AdviceUtil
(1)@Aspect注解——将类声明为切面
@Aspect
public class AdviceUtil {
}
(2)@Before注解——声明为前置增强方法
/**
* 使用@Before注解将方法声明为前置增强方法
* 参数中需要加入:匹配切点的表达式execution(public void com.wzj.entity.Student.say())
* 匹配切点的表达式:execution(修饰符 返回值 方法全名(..))
* 可以使用“*”和“..”通配符,* 表示匹配所有,.. 用在方法参数中,表示匹配任意个数、类型的参数
*/
@Before("execution(public void com.wzj.entity.Student.say()))")
public void before(){
System.out.println("----->前置增强操作");
}
(3)@AfterReturning注解——声明后置增强方法
@AfterReturning("execution(public void com.wzj.entity.Student.say())")
public void behind(){
System.out.println("----->后置增强操作");
}
【为了获取到代理对象以及方法的相关信息,可以再增强方法中声明一个JoinPoint类型参数,spring会自动注入该参数】