常用的编程范式
AOP 是什么
是一种编程方式,不是编程语言
解决特定问题,不能解决所有的问题
OOP的补充,不是代替
AOP 初衷
DRY: Don't repeat yourself(代码重复)
SoC:Separation of Concerns(关注点分离)
水平分离:展示层-> 服务层 -> 持久层
垂直分离:模块划分(订单、库存等)
切面分离:分离功能性需求与非功能性需求
AOP的优点
集中处理某一关注点/横切逻辑
可以很方便地添加/删除关注点
侵入性少,增强代码可读性及可维护性
AOP的应用场景
权限控制
缓存控制
性能监控
...
支持AOP的语言
Java、Python、PHP...
SpringAOP使用详解
首先,我整理了一张图,让大家更好的梳理SpringAOP的使用
@Poincut 详解匹配包/类型_ within()匹配对象匹配参数 args()
匹配任何以find开头而且只有一个Long参数的方法
@Pointcut("execution(*..find(Long))")
匹配任何以find开头的而且第一个参数为Long型的方法
@Pointcut("execution(*..find(Long,..))")
匹配任何只有一个Long参数的方法
@Pointcut("within(com.zhb..*) && args(Long)")
匹配第一个参数为Long型的方法
@Pointcut("within(com.zhb..*) && args(Long,..)")
匹配注解
匹配方法标注有AdminOnly的注解的方法
@Pointcut("@annotation(com.zhb.anno.AdminOnly) && within(com.zhb..*)")
匹配标注有NeedSecured的类底下的方法 //class级别
@Pointcut("@within(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
匹配标注有NeedSecured的类及其子类的方法 //runtime级别
在spring context的环境下,二者没有区别
@Pointcut("@target(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
匹配传入的参数类标注有Repository注解的方法
@Pointcut("@args(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
匹配方法
匹配任何公共方法
@Pointcut("execution(public * com.zhb.service..(..))")
匹配com.zhb包及子包下Service类中无参方法
@Pointcut("execution(* com.zhb..Service.())")
匹配com.zhb包及子包下Service类中的任何只有一个参数的方法
@Pointcut("execution(* com.zhb..Service.(*))")
匹配com.zhb包及子包下任何类的任何方法
@Pointcut("execution(* com.zhb...(..))")
匹配com.zhb包及子包下返回值为String的任何方法
@Pointcut("execution(String com.zhb...(..))")
匹配异常
execution(public * com.zhb.service..(..) throws java.lang.IllegalAccessException)
其实,这么多实际工作中用到的比较少,我平时就用过execution 这一个。
Advice 详解
@Before(value = "matchLongArg() && args(productId)")
public void beforeWithArgs(Long productId)
@AfterReturning(value = "matchReturn()",returning = "returnValue")
public void getReulst(Object returnValue)
给出一段常用代码
大家再用到的时候可以自行搜索
领取专属 10元无门槛券
私享最新 技术干货