最近在看spring aop的内容,在这作个笔记。 1、介绍 一、了解编程范式: (1)面向过程编程:C语言 (2)面向对象编程:Java、C++ (3)函数式编程 (4)事件驱动编程:GUI (5)面向切面编程:AOPphp
二、AOP是什么? 是一种编程方式,不是编程语言。 解决特定问题,不是全部问题 aop是面向对象编程的补充c++
三、Aop初衷: DRY:Don’t repeat yourself 不用重复代码 SoC:Separation of Concenrns 关注点分离 水平分离:展现层、服务层、持久层 垂直分离:模块划分(订单、库存) 切面分离:分离功能性需求和非功能性需求spring
四、Aop好处: 集中处理管理某一关注点/横切逻辑 能够很方便添加、删除关注点 侵入性少,加强代码可读性以及维护性编程
五、Aop应用场景 权限控制 缓存控制 事务控制 审计日志 性能监控 分布式追踪 异常处理缓存
六、支持AOP的编程语言:Java、 .net.、 c/c++、 ruby、Python 、php等等,包括面向对象语言,也包括脚本语言ruby
2、AOP的简单实现 主要步骤有: (1)引入aop maven 依赖; (2)编写切面代码(主要用到@Aspect、@Pointcut和通知注解); (3)编写单元测试,运行。maven
主要代码: 一、maven依赖:编程语言
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
二、业务逻辑类:分布式
@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(); } }
三、切面类:函数式编程
@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"); // } }
四、单元测试类
@RunWith(SpringRunner.class) @SpringBootTest public class AopTestApplicationTests { @Autowired private ProductService productServie; @Test public void contextLoads() throws Exception { productServie.saveProduct(); // productServie.deleteProduct(); // productServie.deleteProduct_throwWrong(); } }