gpt4 book ai didi

java - 无法捕获和处理java中的spring自定义事件

转载 作者:行者123 更新时间:2023-12-02 08:59:53 25 4
gpt4 key购买 nike

我正在尝试设置一个自定义 Spring 事件发布者和监听器。该过程的流程似乎工作正常,我可以在事件发布之前看到打印,但是,我的事件监听器没有捕获该事件。我的主要类(class)是:

public class TestClass {

public static void main(String[] args) throws Exception {
testEvents();
}

private static void testEvents() throws InterruptedException {
AnnotationConfigApplicationContext eventPublisherContext = new AnnotationConfigApplicationContext(EventListenerConfig.class);
CustomSpringEventPublisher eventPublisher = eventPublisherContext.getBean(CustomSpringEventPublisher.class);
List<CustomSpringEventListener> listenersList = new ArrayList<CustomSpringEventListener>();

for (int i = 0; i < 5; i++) {
listenersList.add(new CustomSpringEventListener("LR" + (i + 1)));
}

for (int i = 0; i < 10; i++) {
Thread.sleep(5000);

LocalDateTime now = LocalDateTime.now();
eventPublisher.doStuffAndPublishAnEvent("new event " + now.format(Formats.isolong));
}
}
}

这是我的自定义事件类:

public class CustomSpringEvent extends ApplicationEvent {
private String message;

public CustomSpringEvent(Object source, String message) {
super(source);
this.message = message;
}

public String getMessage() {
return message;
}

}

这是我的自定义事件发布者类:

@Component
public class CustomSpringEventPublisher {

@Autowired
private ApplicationEventPublisher applicationEventPublisher;

public void doStuffAndPublishAnEvent(final String message) {
System.out.println("Publishing custom event --> " + message);
this.applicationEventPublisher.publishEvent(new CustomSpringEvent(this, message));
}

}

这是我的自定义事件监听器类:

public class CustomSpringEventListener implements ApplicationListener<CustomSpringEvent> {
private String name;

public CustomSpringEventListener(String name) {
this.name = name;
}

@Override
@EventListener
public void onApplicationEvent(CustomSpringEvent event) {
System.out.println(name + " received spring custom event - " + event.getMessage());
}

}

这是我的事件监听器配置类:

@Configuration
@ComponentScan({"some.local.directory.testCases"})
public class EventListenerConfig {
}

我在这里缺少什么?如何让我的监听器类识别已发布的事件并处理它?我看到一些示例,其中监听器类具有 @Component ,但是当我尝试添加它时,我收到了来自 spring 的错误: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. ,而且我也看不出在这种情况下监听器类有这个注释的任何原因。任何帮助,将不胜感激。谢谢。

最佳答案

为了调用事件监听器,Spring 需要知道监听器类并将其放入其 applicationContext 中,位于所谓的 Bean 下。

您确实需要使用@Component来注释您的类。但当您这样做时,您会收到错误。让我们澄清一下这一点。

Spring 快速概述

@Component注释的类将向Spring表明它需要自己“管理”该类。通过管理,它包括首先创建所有“依赖项”,然后调用“构造函数”。我们将其称为依赖树。一旦 Spring 到达底部,它就可以开始向上爬并创建对象并返回顶部。

依赖管理

Spring 通过分析 @Autowired 注释的构造函数、setter 或属性来了解类的依赖关系。请注意,如果您的类只有一个构造函数,Spring 会自动扫描它以了解依赖关系,即使其顶部没有 @Autowired 也是如此。

就您而言,对于 CustomSpringEventListener,您有一个构造函数接受参数 String。如果我们构建 CustomSpringEventListener 的依赖关系树,我们会得到类似的结果:

CustomSpringEventListener ---> String

因此,当 Spring 尝试创建您的 CustomSpringEventListener 时,它将查找 String 类型的 bean,因为,您的代码是这样说的:如果您想创建一个对象CustomSpringEventListener,您需要给出一个字符串名称。但我猜你的代码中没有 String 类型的 bean。

解决方案

第一次,使用 @Component 注释您的类 CustomSpringEventListener 并删除您的属性和构造函数。

@Component
public class CustomSpringEventListener implements ApplicationListener<CustomSpringEvent> {

@Override
@EventListener
public void onApplicationEvent(CustomSpringEvent event) {
System.out.println("Received spring custom event - " + event.getMessage());
}

}

如果你真的需要的话,再次寻找一种不同的方式在你的类(class)中拥有一个名字。

具有属性的监听器

假设您需要一个更复杂的监听器,例如使用 ServiceA 的监听器。您可以执行以下操作:

@Service
public class ServiceA { ... }
@Component
public class CustomSpringEventListener implements ApplicationListener<CustomSpringEvent> {
private ServiceA serviceA;

public CustomSpringEventListener(ServiceA serviceA) {
this.serviceA = serviceA;
}

}

具有名称的同一监听器

您可以组合@Configuration类来创建多次相同的监听器。让我们使用您的第一个监听器,以及 name 属性。

public class CustomSpringEventListener implements ApplicationListener<CustomSpringEvent> {
private String name;

public CustomSpringEventListener(String name) {
this.name = name;
}

@Override
@EventListener
public void onApplicationEvent(CustomSpringEvent event) {
System.out.println(name + " received spring custom event - " + event.getMessage());
}

}

如果没有@Component注释,您可以使用@Configuration类来实例化您的监听器:

@Configuration
public ListenerConfig {

public CustomSpringEventListener listenerA() {
return new CustomSpringEventListener("listenerA");
}

public CustomSpringEventListener listenerB() {
return new CustomSpringEventListener("listenerB");
}

public CustomSpringEventListener listenerC() {
return new CustomSpringEventListener("listenerC");
}

...
}

您可以混合 Spring 配置来完成您需要的任何配置。

希望有帮助。

关于java - 无法捕获和处理java中的spring自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60248602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com