如何通过代码注册一个Spring ApplicationListener实现?

2023-12-22

我有一个 Spring 的实现ApplicationListener。当它在上下文 xml 文件中声明为 bean 或如果我使用时,它工作正常并接收事件@Component注解。

但是,如果我使用以下代码通过代码手动注册它,它不会接收事件ConfigurableListableBeanFactory's registerSingleton()方法。

我在下面添加了一些示例代码,描述了工作和不工作的情况。

自定义事件.java

package com.test.event;

import org.springframework.context.ApplicationEvent;

public class CustomEvent extends ApplicationEvent {

    public CustomEvent(Object source) {
        super(source);
    }

    public String toString() {
        return "My Custom Event";
    }
}

CustomEventPublisher.java

package com.test.event;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;

public class CustomEventPublisher implements ApplicationEventPublisherAware {

    private ApplicationEventPublisher publisher;

    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void publish() {
        CustomEvent ce = new CustomEvent(this);
        publisher.publishEvent(ce);
    }
}

自定义事件处理程序.java

package com.test.event;

import org.springframework.context.ApplicationListener;

public class CustomEventHandler 
   implements ApplicationListener<CustomEvent>{

   public void onApplicationEvent(CustomEvent event) {
      System.out.println(event.toString());
   }

}

applicationContextWithListenerBean.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="customEventHandler" 
      class="com.test.event.CustomEventHandler"/>

   <bean id="customEventPublisher" 
      class="com.test.event.CustomEventPublisher"/>

</beans>

applicationContextWithoutListenerBean.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="customEventPublisher" 
      class="com.test.event.CustomEventPublisher"/>

</beans>

主应用程序.java

package com.test.event;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args){

        /* The below code works fine when listener bean customEventHandler is defined in xml */

        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContextWithListenerBean.xml");
        CustomEventPublisher cvp = (CustomEventPublisher) context
                .getBean("customEventPublisher");
        cvp.publish();
        context.close();

        /* The below code doesn't work when listener bean is registered through code. Is it possible to make this work? */

        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContextWithoutListenerBean.xml");
        context.getBeanFactory().registerSingleton("customEventHandler",
                new CustomEventHandler());
        CustomEventPublisher cvp = (CustomEventPublisher) context
                .getBean("customEventPublisher");

        cvp.publish();
        context.close();
    }
}

是不是不能注册一个ApplicationListener通过代码?


将 bean 注册为单例将不会使其能够在 ApplicationEvents 上回调。

context.getBeanFactory().registerSingleton("customEventHandler",
            new CustomEventHandler());

应该改为

context.addApplicationListener(new CustomEventHandler());

这会将 ApplicationListener 实现添加到应用程序事件多播器 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/event/ApplicationEventMulticaster.html它将事件发布到应用监听器 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/ApplicationListener.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过代码注册一个Spring ApplicationListener实现? 的相关文章

  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 如何从 Spring Boot 中排除依赖项

    我正在使用 Spring Boot 以下是我的 gradle 文件 buildscript ext springBootVersion 2 0 0 BUILD SNAPSHOT repositories mavenCentral maven
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try

随机推荐

  • Cloudera Impala 连接到 Tableau 错误

    我正在研究使用 Tableau 连接到 Cloudera Hadoop 我提供服务器和端口详细信息并使用 Impala 进行连接 我能够成功连接 选择默认架构并选择所需的表 此后 当我将维度或度量拖放到行 列时grid 我收到以下错误 Cl
  • 如何在 lambda 和 gekko 中使用 If...else

    场景如下 我想最大限度地降低运行电机的成本 我有 X 个电机 每个电机都有一个下限和一个上限 它不能超过上限 也不能低于下限 除非它与 0 一致 当这些电机必须达到 Y 的功率时 我必须找到一种方法来最小化这些电机的成本 并非每个电机都必须
  • 使用 BOOL 属性

    Apple 建议以这种方式声明 BOOL 属性 property nonatomic assign getter isWorking BOOL working 由于我使用的是 Objective C 2 0 属性和点表示法 因此我使用以下方
  • Java泛型类型问题

    考虑以下简化示例 package com test class B
  • 在android中创建EHCache实例时出现java.lang.ExceptionInInitializerError

    我尝试在 Android 中使用 ehCache 并收到以下错误 java lang ExceptionInInitializerError at net sf ehcache EhcacheDefaultClassLoader getIn
  • 从 Twilio 发送短信不会在手机上显示友好名称

    当我发送测试短信时https www twilio com user account developer tools api explorer message create https www twilio com user account
  • 如何使用 C# 以编程方式定位我的 Dropbox 文件夹?

    如何使用 C 以编程方式定位我的 Dropbox 文件夹 注册表 环境变量 ETC 更新的解决方案 Dropbox 现在提供一个 info json 文件 如下所示 https www dropbox com en help 4584 ht
  • 静态变量初始化的顺序,Java [重复]

    这个问题在这里已经有答案了 可能的重复 Java静态类初始化 https stackoverflow com questions 3499214 java static class initialization 类中的静态块和静态变量按什么
  • 来自 NSAttributedString 的 HTML

    我需要将 HTML 转换回 HTML 而不是将其转换为属性字符串 这可以在 Mac 上轻松完成 如下所示 http www justria com 2011 01 18 how to convert nsattributedstring t
  • 如何浏览 iPhone 图片库中的图片?

    我是ios开发新手 我正在做一个照片裁剪应用程序 我想通过单击浏览按钮 我在应用程序中添加 来浏览 iPhone 图片库中的图像 并将其加载到我放置在视图中的 UIImageview 如何浏览图像 是否可以浏览完整的手机内存 就像 asp
  • Firebase、Swift:向给定设备令牌的特定用户发送推送通知

    我有一个 Firebase Swift 聊天应用程序 我想在其中向特定用户发送推送通知 我已经捕获并可以访问用户的设备令牌 所有参考文献都提到必须有一个 网络应用程序 来管理这个 但我还没有找到任何具体的例子 是否需要有一个 Web 应用来
  • GKTurnBasedEventListener 无法设置为我的 ViewController 的委托?

    在 objC 中 语法由拉温德里奇 https www raywenderlich com 5509 beginning turn based gaming with ios 5 part 2 for GKTurnBasedEventLis
  • Eclipse 中针对 JavaScript 代码的“缺少分号”警告

    对于以下代码的第 4 行 Eclipse 向我发出警告 缺少分号 const C b function foo alert x 它不适用于以下代码 const C b function foo alert x 对于以下内容 它给了我两个警告
  • 如何动态为 FullCalendar 事件分配颜色

    我正在尝试在 FullCalendar 可选演示中实现一项功能 该功能使用户能够使用 HTML 颜色选择器动态更改每个新日历事件的颜色 用户应该能够为每个事件选择唯一的颜色 例如 在当前设置中 生成的第一个事件采用颜色选择器中选择的任何颜色
  • 在 Spring Batch 项目中实现 ItemReader 时如何打开 Reader?

    在 Spring Batch 项目中 我需要用多行组成一条记录 我正在实施ItemReader在返回对象之前累积多行 在完成了几个示例项目之后 我将其拼凑在一起 但我面临着ReaderNotOpenException 我已经三次检查文件的路
  • 电子邮件确认不存储 Django allauth

    我正在使用 Django allauth 和 django rest auth 我通过电子邮件确认实现了身份验证 但现在我意识到它不能完全正常工作 因为我没有在数据库中存储发送电子邮件确认 在管理中看不到它们 电子邮件确认正在按应有的方式发
  • Pandas:根据另一列中的值对两列进行分组

    我对 python pandas 很陌生 我有一个看起来像这样的数据框 id name color id 1 alex blue id 2 james yellow id 1 sara black id 4 dave pink id 4 l
  • 使用反射将字符串转换为 Nullable

    如何使用反射将字符串转换为可空值 我有以下代码可以将几乎任何值转换为几乎任何值类型 上面有相当多的代码使用 IsAssignableFrom 等 所以这是最后的手段 MethodInfo parse t GetMethod Parse ne
  • 取消注册通过清单注册的广播接收器

    是否可以注销BroadcastReceiver已通过清单注册 另请告诉我是否可以忽略BroadcastReceiver 无需进行任何代码更改 因为这样BroadcastReceiver现在对我来说没有用了 谢谢 您可以使用以下代码禁用接收器
  • 如何通过代码注册一个Spring ApplicationListener实现?

    我有一个 Spring 的实现ApplicationListener 当它在上下文 xml 文件中声明为 bean 或如果我使用时 它工作正常并接收事件 Component注解 但是 如果我使用以下代码通过代码手动注册它 它不会接收事件Co