1、面向切面编程 :是一种编程范式,不是编程语言 ;解决特定问题,不能解决所有问题;是oop的补充,不是替代
面向过程编程 面向对象编程 函数式编程
事件驱动编程 面向切面编程
DRY :Don't Repeat Yourself 解决代码重复性的问题
SOC: Separation of Concerns
---- 水平分离:展示层--》服务层--》持久层
---- 垂直分离:模块划分(订单、库存等)
---- 切面分离:分离功能性需求与非功能性需求
使用AOP的好处
集中处理某一关注点/横切逻辑
可以很方便地添加/删除关注点
侵入性少,增强代码可读性及可维护性
使用场景
权限控制 缓存控制 事务控制 审计日志 性能监控 分布式追踪 异常处理
AOP注解注解实现:
@Aspect:切面 = 切点+通知(手动添加的代码,一般是方法);
@Point:切点,横切关注点;
@Before:添加的内容在切点之前执行;
------------------------------------
@Autowired:自动装配,与Spring注入相关,可按类型、名装配;
Spring注解@Component、@Controller、@Service、@Repository;
使用@Aspect注解将一个java类定义为切面类
使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。
根据需要在切入点不同位置的切入内容,5种类型的通知
使用@Before在切入点开始处切入内容
使用@After在切入点结尾处切入内容
使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑
Spring AOP
1、XML配置
2、注解方式
AspectJ注解
@Aspect
@Pointcut
Advice
Pointcut :切面表达式
designators:指示器,描述通过什么方式去匹配Java的那些方法
execution():匹配方法
匹配注解
@target()
@args()
@within()
@annotation()
within():匹配包/类型
this()/bean()/target():匹配对象
args():匹配参数
wildcards:通配符(*:匹配任意数量的字符;+匹配指定类及其子类;..:一般用于匹配任意数的子包或参数)
operators: 运算符(&&:与操作符;||或;!:非)
匹配包/类型 (within())
Spring AOP
最新推荐文章于 2024-06-08 13:54:29 发布