<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當某個事件需要被監聽的時候,我們需要去做其他的事前,最簡單的方式就是將自己的業務 方法追加到該事件之後。
但是當有N多個這樣的需求的時候我們都這樣一個個去新增修改事件的原始碼嗎?
這篇文章將告訴你如何用一個註解,就可以將你的業務程式碼通過切面的方式新增到事件的前後,而不需要修改事件的程式碼
如下圖所示,add方法內並沒有呼叫其他的方法,但是其他方法仍然被執行了。
只要給監聽方法加@AddEventListener()註解就可以讓它在事件前後執行了
該方法是利用切面、註解、反射來實現SpringBoot的事件監聽的
1.通過Aspect的切面,切入事件方法
首先使用Aspec的Around(也可以用before或者after,但是比較麻煩)註解,切入AddEvent的方法中,around註解的方法中,可以在事件方法的執行前後新增業務程式碼。但是我們不直接加入需要新增的業務,進入第二步驟。
2.利用反射獲取被AddEventAop註解的類和方法
利用反射Class.forName(class),獲取被AddEventAop註解的類(當然你也可以修改一下,獲取所有的類),該類哪個方法被AddEventListener註解了,就執行該方法,則監聽執行成功。
method.invoke(o, args);
注意(非常重要)
@Around("@annotation(event)") public Object addEventListener(ProceedingJoinPoint joinPoint, AddEventAop event) throws Throwable { Object[] args = joinPoint.getArgs(); //儲存需要在方法執行之後再執行的類 List<Method> afterEventMethod = new ArrayList<>(); //反射獲取AddEventListener修飾的方法並執行 //獲取自定義註解的設定 final Map<String, Object> beans = applicationContext.getBeansWithAnnotation(AddEventAop.class); for (String key : beans.keySet()) { //Spring 代理類導致Method無法獲取,這裡使用AopUtils.getTargetClass()方法 Object o = beans.get(key); Class<?> aClass = beans.get(key).getClass(); String name = aClass.getName(); //aop切面會導致方法註解丟失,在這裡處理獲取原類名 if (name.contains("$$")){ String[] names = name.split("\$\$"); name=names[0]; aClass = Class.forName(name); } Method[] methods = aClass.getMethods(); for (Method method : methods) { //獲取指定方法上的註解的屬性 AddEventListener annotation = method.getAnnotation(AddEventListener.class); if (annotation!=null){ //執行所有的註解了該類的方法 EventType value = annotation.value(); if (value.equals(EventType.BEFOREEVENT)){ method.invoke(o, args); }else{ afterEventMethod.add(method); } } } } //執行被切面的方法 Object proceed = joinPoint.proceed(args); //執行需要在方法執行之後再執行的方法 for (Method method : afterEventMethod) { Class<?> aClass = method.getDeclaringClass(); Object o = aClass.newInstance(); method.invoke(o, args); } return proceed; }
到此這篇關於SpringBoot利用切面註解及反射實現事件監聽功能的文章就介紹到這了,更多相關SpringBoot事件監聽內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45