一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
AOP中的相关概念
接下来就来讲解一下AOP中的相关概念,了解了AOP中的概念,才能真正的掌握AOP的精髓。这里还是先给出概念定义:
- Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
- Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
- Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
- Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
- Target(目标对象):织入 Advice 的目标对象.。 Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
增强方式
增强的类型有前置增强、后置返回增强、异常增强、环绕增强、引介增强、后置最终增强等
MethodBeforeAdvice前置增强
前置增强MethodBeforeAdvice :
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("==前置增强");
System.out.println("==方法名:" + method.getName());
if (null != args && args.length > 0) {
for (int i = 0; i < args.length; i++) {
System.out.println("==第" + (i + 1) + "参数:" + args[i]);
}
}
System.out.println("==目标类信息:" + target.toString());
}
AfterReturningAdvice后置增强
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("==后置增强");
System.out.println("==方法名:" + method.getName());
if (null != args && args.length > 0) {
for (int i = 0; i < args.length; i++) {
System.out.println("==第" + (i + 1) + "参数:" + args[i]);
}
}
System.out.println("==目标类信息:" + target.toString());
}
ThrowsAdvice异常增强
public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {
System.out.println("==异常增强");
System.out.println("==方法名:" + method.getName());
if (null != args && args.length > 0) {
for (int i = 0; i < args.length; i++) {
System.out.println("==第" + (i + 1) + "参数:" + args[i]);
}
}
System.out.println("==目标类信息:" + target.toString());
System.out.println("==异常信息:" + ex.toString());
}
MethodInterceptor环绕增强
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("==环绕增强开始");
System.out.println("==方法名:" + invocation.getMethod().getName());
Object[] args = invocation.getArguments();
if (null != args && args.length > 0) {
for (int i = 0; i < args.length; i++) {
System.out.println("==第" + (i + 1) + "参数:" + args[i]);
}
}
Object proceed = invocation.proceed();
System.out.println("==环绕增强结束");
return proceed;
}
总结
以上简单介绍了前置增强、后置增强、环绕增强、异常增强等以编码实现的方式,当然以上实现也可以通过配置文件的方式实现。
本篇介绍的知识点比较简单,但是理解增强的概念是AOP的基础,AOP其本质还是JDK或CGLIB动态代理,之后会讲解到JDK和CGLIB动态代理,本篇的分析就到这里了。
掘友们,如果觉得有用就留下个赞或评论再走吧!谢啦~ 💐