当前位置: 首页 > news >正文

机关网站及新媒体建设实施方案做我的世界的mod的网站

机关网站及新媒体建设实施方案,做我的世界的mod的网站,河南省近期新闻热点,二维码推广赚佣金平台SpringBoot - 事件机制使用详解#xff08;ApplicationEvent、ApplicationListener#xff09; Spring 事件机制使用观察者模式来传递事件和消息。我们可以使用 ApplicationEvent 类来发布事件#xff0c;然后使用 ApplicationListener 接口来监听事件。当事件发生时#…SpringBoot - 事件机制使用详解ApplicationEvent、ApplicationListener Spring 事件机制使用观察者模式来传递事件和消息。我们可以使用 ApplicationEvent 类来发布事件然后使用 ApplicationListener 接口来监听事件。当事件发生时所有注册的 ApplicationListener 都会得到通知。事件用于在松散耦合的组件之间交换信息。由于发布者和订阅者之间没有直接耦合因此可以在不影响发布者的情况下修改订阅者反之亦然。下面通过样例样式事件机制的使用。 1基本用法 1首先我们创建一个自定义事件类 MyEvent该类继承自 ApplicationEvent 类。 // 自定义事件类 public class MyEvent extends ApplicationEvent {private String message;public MyEvent(Object source, String message) {super(source);this.message message;}public String getMessage() {return message;} }2接着定义一个事件监听器类 MyEventListener该类实现 ApplicationListener 接口并注册为 Spring 的组件。只要监听器对象在 Spring 应用程序上下文中注册它就会接收事件。当 Spring 路由一个事件时它使用监听器的签名来确定它是否与事件匹配。 // 事件监听器 Component public class MyEventListener implements ApplicationListenerMyEvent {// 事件发生时执行Overridepublic void onApplicationEvent(MyEvent event) {System.out.println(接收到事件: event.getMessage());// 模拟事件处理try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}} }3最后我们可以使用 ApplicationContext 的 publishEvent 方法来发布事件。 RestController public class HelloController {Autowiredprivate ApplicationContext context;GetMapping(/hello)public void hello() {System.out.println(准备发送事件);context.publishEvent(new MyEvent(this, welcome to hangge.com));System.out.println(事件发送完毕);} }4启动项目测试一下我们访问 /hello 接口时控制台输出如下说明事件机制运行成功。 注意spring 事件是同步的这意味着发布者线程将阻塞直到所有监听都完成对事件的处理为止。 2使用 EventListener 监听事件 1上面样例我们通过实现 ApplicationListener 接口来定义监听器。从 Spring 4.1 开始可以使用 EventListener 注解的方法以自动注册与该方法签名匹配的 ApplicationListener监听器类同样需要注册为 Spring 的组件。下面代码的效果同上面是一样的 // 事件监听器 Component public class MyEventListener{// 使用注解实现事件监听EventListenerpublic void onApplicationEvent(MyEvent event) {System.out.println(接收到事件: event.getMessage());// 模拟事件处理try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}} }2我们可以使用 EventListener 注解的 value 属性来指定我们要监听的事件类型。比如下面代码来监听 MyEvent 类型的事件 如果需要同时指定多个事件类型可以这么写EventListener{MyEvent.classAnotherEvent.class}。 // 事件监听器 Component public class MyEventListener{// 使用注解实现事件监听EventListener(MyEvent.class)public void onApplicationEvent(MyEvent event) {System.out.println(接收到事件: event.getMessage());} }3我们可以使用 EventListener 注解的 condition 属性来指定事件监听器的执行条件。在下面的代码中#event.message ‘hello’ 是一个 SpEL 表达式表示当事件的 message 属性值为 hello 时事件监听器才会被执行。 1SpEL (Spring Expression Language) 是一种强大的表达式语言用于在运行时执行各种表达式。我们可以使用 SpEL 表达式来访问对象的属性、调用对象的方法、执行运算等。 2SpEL 表达式语法如下 属性访问使用 . 操作符访问对象的属性例如object.property 表示访问对象 object 的属性 property。 方法调用使用 () 操作符调用对象的方法例如object.method() 表示调用对象 object 的方法 method。 运算符SpEL 支持常用的运算符包括算术运算符、关系运算符、逻辑运算符等。 3SpEL 表达式还支持一些特殊的操作符和函数如下所示 ? 操作符三目运算符形如 (condition ? then : else)表示当 condition 为真时返回 then否则返回 else。 instanceof 操作符用于判断对象是否为某个类型形如 object instanceof T表示对象 object 是否为类型 T。 t() 函数将对象转换为给定的类型形如 t(T)表示将对象转换为类型 T。 elvis 操作符用于判断对象是否为空形如 object ?: defaultValue表示如果对象不为空则返回对象否则返回默认值。 // 事件监听器 Component public class MyEventListener{// 使用注解实现事件监听EventListener(condition #event.message hello)public void onApplicationEvent(MyEvent event) {System.out.println(接收到事件: event.getMessage());} }4对于使用 EventListener 注解并定义为具有返回类型的方法Spring 会将结果作为新事件发布。在下面的示例中第一个方法返回的 AnotherEvent 将被发布然后由第二个方法处理。 // 事件监听器 Component public class MyEventListener{EventListenerpublic AnotherEvent listener1(MyEvent event) {// 处理事件System.out.println(事件监听器 1 接收到事件: event.getMessage());return new AnotherEvent(this, 转发 event.getMessage());}EventListenerpublic void listener2(AnotherEvent event) {// 处理事件System.out.println(事件监听器 2 接收到事件: event.getMessage());} }3使用 Order 指定优先级 1当 Spring 发布一个事件时会调用所有能处理这个事件的事件监听器方法。如果你有多个事件监听器方法那么 Spring 会依次调用这些方法。比如下面样例当发布一个 MyEvent 事件时Spring 会依次调用这两个方法。 // 事件监听器 Component public class MyEventListener{EventListenerpublic void listener1(MyEvent event) {// 处理事件System.out.println(事件监听器 1 接收到事件: event.getMessage());}EventListenerpublic void listener2(MyEvent event) {// 处理事件System.out.println(事件监听器 2 接收到事件: event.getMessage());} }2我们可以使用 Order 注解来指定事件监听器方法的优先级。Order 注解可以标注在类上或方法上表示这个类或方法的优先级。数值越小优先级越高。 // 事件监听器 Component public class MyEventListener{Order(2)EventListenerpublic void listener1(MyEvent event) {// 处理事件System.out.println(事件监听器 1 接收到事件: event.getMessage());}Order(1)EventListenerpublic void listener2(MyEvent event) {// 处理事件System.out.println(事件监听器 2 接收到事件: event.getMessage());} }4使用 Async 实现异步事件监听 1从第一个样例运行结果可以看出默认 spring 事件是同步的这意味着发布者线程将阻塞直到所有侦听器都完成对事件的处理为止。我们可以使用 Async 注解来标注一个事件监听器方法表示这个方法是一个异步方法应该在独立的线程中执行。 // 事件监听器 Component public class MyEventListener{// 使用注解实现事件监听AsyncEventListenerpublic void onApplicationEvent(MyEvent event) {System.out.println(接收到事件: event.getMessage());// 模拟事件处理try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}} }2同时我们还需要在配置类Configuration 类之一或 SpringBootApplication 类中启用异步处理才能使用 Async 注解。 Configuration EnableAsync public class MyConfig {// 配置类 }3最后测试一下可看到实现了异步事件监听 附Spring Boot 内置的 Application Event 1Spring Boot 中包含了一些与 SpringApplication 生命周期相关的内置 Application Event包括 ApplicationStartingEvent在 Spring Boot 应用程序启动之前发布。ApplicationEnvironmentPreparedEvent在 Spring Boot 应用程序的环境已经准备好但正在创建 Application Context 上下文之前发布。ApplicationContextInitializedEvent当 Spring Boot 应用程序 Application Context 上下文准备就绪并且调用ApplicationContextInitializers但尚未加载 bean 定义时发布。ApplicationPreparedEvent在 Spring Boot 应用程序的 Application Context 上下文已经创建但尚未刷新之前发布。ApplicationStartedEvent在 Spring Boot 应用程序的 Application Context 上下文已经刷新但尚未启动之前发布。ApplicationReadyEvent在 Spring Boot 应用程序已经启动并准备接受请求之后发布。ApplicationFailedEvent在 Spring Boot 应用程序启动失败时发布。 2假设我们需要监听 ApplicationStartingEvent则首先定义一个监听器类 // 事件监听器 public class MyEventListener implements ApplicationListenerApplicationStartingEvent {// 事件发生时执行Overridepublic void onApplicationEvent(ApplicationStartingEvent event) {// 处理事件System.out.println(应用程序将要启动);} }3由于该事件实际上是在 Application Context 创建前触发的这时的 Bean 是不能被加载的。所以我们不能在这个监听器类上中使用 Component 注册监听器只能通过 SpringApplication 注册监听器。我们对项目启动类做如下修改 注意对于ApplicationStartedEvent、ApplicationReadyEvent、ApplicationFailedEvent 这些在 Application Context上下文已经创建完毕之后所以可以直接使用 Component 注册不需要下面这个步骤。 SpringBootApplication public class RmiserverApplication {public static void main(String[] args) {SpringApplication app new SpringApplication(RmiserverApplication.class);app.addListeners(new MyEventListener()); //注册监听器app.run(args);} }或者也可以使用使用 SpringApplicationBuilder 注册监听器 SpringBootApplication public class RmiserverApplication {public static void main(String[] args) {new SpringApplicationBuilder().sources(RmiserverApplication.class).listeners(new MyEventListener()) //注册监听器.run(args);} }4启动项目可以看到控制台输出如下
http://www.sadfv.cn/news/127853/

相关文章:

  • 孔为民医生个人网站外管局网站先支后收怎么做报告
  • 建德网站网络舆情监测专升本对口专业
  • 网站开发维护员挣钱吗昆山网站建设公司哪家好
  • 设计一份包含网站建设范南京百度seo公司
  • 网站建设力度不够论文企业网
  • 都江堰网站建设公司网站的标签修改
  • 南阳网站建设aokuo网站建设知识文章
  • 如何做网站排名第一建设网站征集图片的通知
  • 做网站用的字体钦州建设银行社招聘网站
  • 云霄网站建设wordpress微信机器人下载
  • 联通 网站备案最好的科技网站建设
  • 网站维护中模版网红营销成功案例
  • 个人网站用wordpress吗山东省建设科技协会网站首页
  • 上海网站建设公司推荐成都网站建设低价
  • 零基础网站建设教学公司wordpress制作留言板
  • 网站源码php旅游网站流程图
  • 网站自定义功能实现网上推广营销
  • 2_网站建设的一般步骤包含哪些?重庆重庆网站建设公司
  • 做动态图网站有哪些莱州网站建设公司
  • 广告公司寮步网站建设价钱北京好的做网站的公司
  • iis 建立子网站用html做简单网页
  • 计算机网站开发开题报告范文wordpress修改菜单栏
  • 哈尔滨网站建设运营linux 中 wordpress
  • 长春长春网站建设网网站开发用什么
  • 免费网站申请域名com企业展厅策划方案
  • 汉中北京网站建设淘客怎么做网站推广
  • 公司网站上线流程珠海网站建设科技公司
  • 做个人网站用什么程序怎样做免费外贸网站
  • 万网域名中文网站查询厦门网站专业建设
  • 兖州网站建设推广西湖区外贸网站建设