想要环绕拦截一个 Bean 的函数。需要三个前置条件:

  1. 通过注解做为“切点”,进行拦截(不能无缘无故给拦了吧?费性能)
  2. Bean 的 method 是被代理的
  3. 在 Bean 被扫描之前,完成环绕拦截的注册

1、定义切点和注册环绕拦截

Solon 的切点,通过注解实现,得先定义一个。例如:@Logging

//@Target 是决定可以注在什么上面的
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Logging {
boolean enable() default true;
}

定义拦截器

//简单点处理
@Slf4j
public class LoggingInterceptor implements Interceptor {
@Override
public Object doIntercept(Invocation inv) throws Throwable {
//此处为拦截处理
Object rst = inv.invoke(); log.info("Args: {}\nReturn: {}", inv.args(), rst); return rst;
}
} //如果需要取注解信息,并进行控制
@Slf4j
public class LoggingInterceptor2 implements Interceptor {
@Override
public Object doIntercept(Invocation inv) throws Throwable {
Logging anno = inv.method().getAnnotation(Logging.class); if (anno == null) {
//因为 Logging 支持 ElementType.TYPE,所以也要检查类上的注解
anno = inv.target().getClass().getAnnotation(Logging.class);
} //此处为拦截处理
Object rst = inv.invoke(); if(anno != null && anno.enable()){
log.info("Args: {}\nReturn: {}", inv.args(), rst);
} return rst;
}
}

手动注册或关联绑定环绕拦截(二种模式,选一即可)

//手动注册模式
Solon.context().beanAroundAdd(Logging.class, new LoggingInterceptor()); //关联绑定模式(通过@Around注解,直接在注解类上关联绑定)
@Around(LoggingInterceptor.class)
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Logging {
}

现在切点定义好了,可以到处“埋”了...

2、应用:把切点“埋”到需要的地方

@Service
public class DemoController{
@Logging
public void addUser(UserModel user){
//...
}
}

就这样完成一个面向切面的开发了。

3、通过插件及插件配置,变成一个复用的东西

这是刚才定义注解:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Logging {
}

开发插件:

@Slf4j
public class XPluginImp implements Plugin {
@Override
public void start(AopContext context) {
context.beanAroundAdd(Logging.class, inv->{
Object rst = inv.invoke(); log.info("Args: {}\nReturn: {}", inv.args(), rst);
});
}
}

配置插件:

solon.plugin=xxx.xxx.log.XPluginImp

一个可复用的插件开发完成了。关于Solon插件开发,可参考别的章节内容。

Solon2 开发之IoC,七、切面与函数环绕拦截的更多相关文章

  1. Python全栈开发之4、内置函数、文件操作和递归

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5476760.html 一.内置函数 Python的内置函数有许多,下面的这张图全部列举出来了,然后我会把一些常用的拿 ...

  2. Spring注解驱动开发之Ioc容器篇

    前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...

  3. UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件

    在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...

  4. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

  5. ArcGIS Engine开发之旅04---ARCGIS接口详细说明

    原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.      IField接口(esriGeoDatabase)... 2 2.    ...

  6. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  7. 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别

    高效开发之SASS篇   作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...

  8. iOS多线程开发之GCD(中级篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  9. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  10. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

随机推荐

  1. 🔥🔥你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?

    引言 在前面的内容中,我们已经详细讲解了一系列与TCP相关的面试问题.然而,这些问题都是基于个别知识点进行扩展的.今天,我们将重点讨论一些场景问题,并探讨如何解决这些问题. 序列号确认问题 当A主机与 ...

  2. webpack配置局域网访问项目

    要配置webpack允许局域网访问项目,你需要做以下几个步骤:   1. 在webpack配置文件中,找到devServer选项,并设置其属性`host`为`0.0.0.0`.这将允许其他设备通过局域 ...

  3. python3使用libpcap给ESL命令添加日志记录

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 python版本:3.9.12 libpcap版本:1.11.0b7   FreeSWITCH的ESL模块用起来很方 ...

  4. 洛谷4055 [JSOI2009]游戏(二分图博弈)

    例题:在N×M的迷宫中有一个棋子,小 AA 首先任意选择棋子放置的位置.然后,小 YY 和小 AA 轮流将棋子移动到相邻的格子里.游戏的规则规定,在一次游戏中,同一个格子不能进入两次,且不能将棋子移动 ...

  5. ThreadPoolExecutor线程池内部处理浅析

    我们知道如果程序中并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束时,会因为频繁创建线程而大大降低系统的效率,因此出现了线程池的使用方式,它可以提前创建好线程来执行任务.本文主要通过j ...

  6. Centos8.4离线安装JDK+Tomcat+MySQL8.0+Nginx

    一.安装JDK 注:以下命令环境在Xshell中进行. 1.查询出系统自带的OpenJDK及版本 rpm -qa | grep jdk 2.如果显示已安装openjdk则对其进行卸载. 输入:rpm ...

  7. [ABC263B] Ancestor

    Problem Statement There are $N$ people, called Person $1$, Person $2$, $\ldots$, Person $N$. The par ...

  8. C++ Qt开发:SpinBox数值微调框组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSpinBo ...

  9. LeetCode227:基本计算器|| (栈、模拟)

    解题思路:两个双端队列模拟,一个存放操作数 a,另一个存放操作符 op,如果找到另一个操作数b,判断操作队列队尾是否是*/,是的话执行 a(*or/)b.遍历完字符串,如果操作符队列非空,说明还有+- ...

  10. 牛客小白月赛2 F题黑黑白白 (博弈或dfs)

    题目链接:https://www.nowcoder.com/acm/contest/86/F 解题思路:赛后看博客都说是sg函数.emmm,后面看了别人代码dfs也可以,只要找到一条能赢的路就可以. ...