最近在看spring aop的内容,在这做个笔记。 一、介绍 1、了解编程范式: (1)面向过程编程:C语言 (2)面向对象编程:Java、C++ (3)函数式编程 (4)事件驱动编程:GUI (5)面向切面编程:AOP
2、AOP是什么? 是一种编程方式,不是编程语言。 解决特定问题,不是所有问题 aop是面向对象编程的补充
3、Aop初衷: DRY:Don’t repeat yourself 不用重复代码 SoC:Separation of Concenrns 关注点分离 水平分离:展示层、服务层、持久层 垂直分离:模块划分(订单、库存) 切面分离:分离功能性需求和非功能性需求
4、Aop好处: 集中处理管理某一关注点/横切逻辑 可以很方便添加、删除关注点 侵入性少,增强代码可读性以及维护性
5、Aop应用场景 权限控制 缓存控制 事务控制 审计日志 性能监控 分布式追踪 异常处理
6、支持AOP的编程语言:Java、 .net.、 c/c++、 ruby、Python 、php等等,包括面向对象语言,也包括脚本语言
二、AOP的简单实现 主要步骤有: (1)引入aop maven 依赖; (2)编写切面代码(主要用到@Aspect、@Pointcut和通知注解); (3)编写单元测试,运行。
主要代码: 1、maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、业务逻辑类:
@Service
public class ProductService{
public void saveProduct() {
System.out.println("save product now ……");
}
public void deleteProduct() {
System.out.println("delete product now ……");
}
public void deleteProduct_throwWrong() throws Exception {
System.out.println("delete product and throw exception now ……");
throw new Exception();
}
}
3、切面类:
@Aspect
@Component
public class AspectTest {
@Pointcut("within(cn.exercise.service.impl.ProductService)")
public void adminOnly() {
}
@Before("adminOnly()")
public void before() {
System.out.println("------------ @Aspect ###before");
}
// @After("adminOnly()")
// public void after() {
// System.out.println("------------ @Aspect ###after");
// }
// @AfterReturning("adminOnly()")
// public void afterReturning() {
// System.out.println("------------ @Aspect ###afterReturning");
// }
// @AfterThrowing("adminOnly()")
// public void after() {
// System.out.println("------------ @Aspect ###afterThrowing");
// }
// @Around("adminOnly()")
// public void Around(ProceedingJoinPoint joinPoint) {
// System.out.println("------------ @Aspect ###around--before");
// try {
// joinPoint.proceed();
// } catch (Throwable e) {
// System.out.println("------------ @Aspect ###around--throwable");
// } finally {
// System.out.println("------------ @Aspect ###around--after");
// }
// System.out.println("------------ @Aspect ###around--last");
// }
}
4、单元测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class AopTestApplicationTests {
@Autowired
private ProductService productServie;
@Test
public void contextLoads() throws Exception {
productServie.saveProduct();
// productServie.deleteProduct();
// productServie.deleteProduct_throwWrong();
}
}