在spring中使用自定义注解注册监听器的方法

编程之家收集整理的这篇文章主要介绍了在spring中使用自定义注解注册监听器的方法编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本篇文章主要介绍了在spring中使用自定义注解注册监听器的方法,本文就是在分析监听器回调原理的基础上,在spring环境中使用自定义的注解实现一个监听器。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

接口回调

监听器本质上就是利用回调机制,在某个动作发生前或后,执行我们自己的一些代码。在Java语言中,可以使用接口来实现。

实现一个监听器案例

为了方便,直接在spring环境中定义:以工作(work)为例,定义工作开始时(或结束时)的监听器。

1. 定义回调的接口

package com.yawn.demo.listener; /** * @author Created by yawn on 2018-01-21 13:53 */ public interface WorkListener { void onStart(String name); }

2. 定义动作

package com.yawn.demo.service; import com.yawn.demo.listener.WorkListener; /** * @author Created by yawn on 2018-01-21 13:39 */ @Service public class MyService { @Resource private PersonService personService; private WorkListener listener; public void setWorkListener(WorkListener workListener) { this.listener = workListener; } public void work(String name) { listener.onStart(name); personService.work(); } }

动作work为一个具体的方法,在work()方法的适当时机,调用前面定义的接口。此外,在这个动作定义类中,需要提高设置监听器的方法

3. 监听测试

@RunWith(springrunner.class) @SpringBoottest public class DemoSpringAnnotationApplicationTests { @Resource private MyService myService; @Test public void test1() { // 接口设置监听器 myService.setWorkListener(new WorkListener() { @Override public void onStart(String name) { System.out.println("Start work for " + name + " !"); } }); // // lambda 表达式设置监听器 // myService.setWorkListener(name -> System.out.println("Start work for " + name + " !")); // 工作 myService.work("boss"); } @Test public void test2() { // 继承实现类设置监听器 myService.setWorkListener(new myWorkListener()); // 工作 myService.work("boss"); } class myWorkListener extends WorkListenerAdaptor { @Override public void onStart(String name) { System.out.println("Start work for " + name + " !"); } } }

使用以上两种方法测试,得到了结果为:

Start work for boss ! working hard ...

说明在动作work发生之前,执行了我们在测试类中写下的监听代码,实现类监听的目的。

使用注解实现监听器

在以上代码中,调用 setWorkListener(WorkListener listener)  方法一般称作设置(注册)监听器,就是将自己写好的监听代码,设置为动作的监听器。然而,在每次注册监听器时,一般需要写一个类,实现定义好的接口或继承实现接口的类,再重写接口定义的方法即可。因此,聪明的程序员就想简化这个过程,所以就想出了使用注解的方法。使用注解,将监听代码段写在一个方法中,使用一个注解标记这个方法即可。

的确,使用变得简单了,但实现却不见得。

1. 定义一个注解

package com.yawn.demo.anno; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface WorkListener { }

2. 解析注解

package com.yawn.demo.anno; import com.yawn.demo.service.MyService; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.LinkedHashMap; import java.util.Map; /** * @author Created by yawn on 2018-01-21 14:46 */ @Component public class WorkListenerParser implements ApplicationContextAware, InitializingBean { @Resource private MyService myService; private ApplicationContext applicationContext; @Override public void afterPropertiesSet() throws Exception { Map listenerBeans = getExpectListenerBeans(Controller.class, RestController.class, Service.class, Component.class); for (Object listener : listenerBeans.values()) { for (Method method : listener.getClass().getDeclaredMethods()) { if (!method.isAnnotationPresent(WorkListener.class)) { continue; } myService.setWorkListener(name -> { try { method.invoke(listener, name); } catch (Exception e) { e.printstacktrace(); } }); } } } /** * 找到有可能使用注解的bean * @param annotationTypes 需要进行扫描的类级注解类型 * @return 扫描到的beans的map */ private Map getExpectListenerBeans(Class extends Annotation>... annotationTypes) { Map listenerBeans = new LinkedHashMap(); for (Class extends Annotation> annotationType : annotationTypes) { Map annotatedBeansMap = applicationContext.getBeansWithAnnotation(annotationType); listenerBeans.putAll(annotatedBeansMap); } return listenerBeans; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }

在注解的解析过程中,设置监听器。

在解析类中,实现了接口ApplicationContextAware,为了在类中拿到ApplicationContext的引用,用于得到 IOC 容器中的 Bean;而实现接口InitializingBean,则是为了在一个合适的时机执行解析注解、设置监听器的代码。 如果不这样做,可以在CommandLineRunner执行时调用解析、设置的代码,而ApplicationContext也可以自动注入。

3. 测试

在执行完以上代码后,监听器就已经设置好了,可以进行测试了。

package com.yawn.demo.controller; import com.yawn.demo.anno.WorkListener; import com.yawn.demo.service.MyService; import org.springframework.web.bind.annota上一篇代码详解java里的“==”和“equels”区别下一篇:深入理解java的spring-ioc的使用 热门搜索

自定义注解 

spring注解 

自定义校验注解 

使用注册 

自定义注释 

相关文章

在spring中使用自定义注解注册监听器的方法

2021-09-10阅读(7138)评论(0)推荐()

本篇文章主要介绍了在spring中使用自定义注解注册监听器的方法,本文就是在分析监听器回调原理的基础上,在spring环境中使用自定义的注解实现一个监听器。小编...

Java使用自定义注解实现为事件源绑定事件监听器操作示例

2021-10-11阅读(5176)评论(0)推荐()

这篇文章主要介绍了Java使用自定义注解实现为事件源绑定事件监听器操作,结合实例形式分析了java自定义注解、注解处理、事件监听与响应等相关操作技巧,需要的朋友...

浅谈自定义注解在Spring中的应用

2021-10-19阅读(5258)评论(0)推荐()

这篇文章主要介绍了浅谈自定义注解在Spring中的应用,具有一定借鉴价值,需要的朋友可以参考下。

Spring 实现自定义监听器案例

2021-11-16阅读(4615)评论(0)推荐()

这篇文章主要介绍了Spring 实现自定义监听器案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Android在自定义类中实现自定义监听器方式

2021-11-14阅读(3451)评论(0)推荐()

这篇文章主要介绍了Android在自定义类中实现自定义监听器方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Spring AOP 实现自定义注解的示例

2021-09-19阅读(5409)评论(0)推荐()

这篇文章主要介绍了Spring AOP 实现自定义注解的示例,帮助大家更好的理解和学习使用spring框架,感兴趣的朋友可以了解下

举例讲解JDK注解的使用和自定义注解的方法

2021-09-19阅读(3813)评论(0)推荐()

今天小编就为大家分享一篇关于举例讲解JDK注解的使用和自定义注解的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

取消

有人回复邮件通知

提交评论

© 2021 编程之家 

工信部备案号:琼ICP备2022000316号

总结

以上是编程之家为你收集整理的在spring中使用自定义注解注册监听器的方法全部内容,希望文章能够帮你解决在spring中使用自定义注解注册监听器的方法所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

Java相关文章

使用SpringBoot2.x配置静态文件缓存
Java动态代理四种实现方式详解
Eclipse开发JavaWeb项目配置Tomcat的方法步骤
详解领域驱动设计之事件驱动与CQRS
SpringBoot全局配置long转String丢失精度的问题解决
springboot yml定义属性,下文中${} 引用说明
IDEA解决Java:程序包xxxx不存在的问题
编程语言榜单Java与Python并列第二!Julia下滑
MyBatis Log 插件无法显示SQL语句的原因解析
jsp response.sendRedirect()用法详解
使用springboot访问图片本地路径并映射成url
springboot文件虚拟路径映射方式