一、概念
AOP,面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
二、作用
AOP的主要功能:权限控制、事务管理 、日志打印、性能统计、异常处理等
三、案例
面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的,与主业务逻辑无关的代码,如安全检查,事物,日志等。若不使用AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,会使业务逻辑变得混杂不清。
举个例子:银行系统取款会有一个流程查询也会有一个流程
上面那个 验证用户 的方框,我们可以把它当成一块板子,在这块板子上插入一些控制流程,这块板子就可以当成是 AOP 中的一个切面。所以 AOP 的本质是在一系列的纵向的控制流程中,把那些相同的子流程提取成一个横向的面,把纵向流程画成一条直线,而 AOP 相当于把相同的地方连起来了。
这个验证用户的子流程 就成了一条直线,也可以理解成一个切面,这里只插了三个流程,如果其他流程也需要这个子流程,也可以插到其他地方去。
演示案例:
- 引入pom依赖,代码如下:
<!--spring AOP的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.25.RELEASE</version>
</dependency>
//上述spring-aspects或者替换aspectjweaver
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.25.RELEASE</version>
</dependency>
2. 建立aspect包,在此包下建立LogAspect类,我们的业务为TestController类中的hello方法在执行前打印一句话,hello方法在执行后打印一句话(真实场景有判断用户是否登陆、日志添加等)。LogAspect代码如下:
@Aspect
@Component
public class LogAspect {
@Before("execution(public * com.yxc.controller.HelloWorldController.hello(..))")
public void before(){
System.out.print("------------------hello 方法执行前-------------------");
}
@After("execution(public * com.yxc.controller.HelloWorldController.hello(..))")
public void after(){
System.out.print("------------------hello 方法执行后-------------------");
}
3.测试,在浏览器访问hello的方法接口,测试结果如下:
四、总结
切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名)
execution(* com.yy.service.*Service.*(..))
切入点表达式描述通配符:作用:用于快速描述,范围描述
* :匹配任意符号(常用)
.. :匹配多个连续的任意符号(常用)
+:匹配子类类型
切入点表达式书写技巧
1.按标准规范开发
2.查询操作的返回值建议使用*匹配
3.减少使用..的形式描述包
4.对接口进行描述,使用*表示模块名,例如UserService的匹配描述为*Service
5.方法名书写保留动词,例如get,使用*表示名词,例如getById匹配描述为getBy*
6.参数根据实际情况灵活调整