gpt4 book ai didi

java - 除非存在 @autowired 依赖项,否则 Spring 框架不会调用 BeanPostProcessor

转载 作者:行者123 更新时间:2023-12-01 06:17:54 24 4
gpt4 key购买 nike

我正在构建一个 TCP 套接字服务器,它使用 Spring Framework (3.2.3.RELEASE) 将事物连接在一起。

一切都是使用带有注释的 Java Config 进行配置的。在 Java 配置中,我有一个 @ComponentScan 注释来扫描类路径中的组件。

当 TCP 套接字服务器接收到消息时,我偶尔想要调度一些事件。为此,我使用 Google Guice EventBus。我不希望 TCP 套接字服务器了解事件接收器,反之亦然,以保持松散耦合。

我已经根据 Patrick Meade @ http://pmeade.blogspot.no/2013/02/using-guava-eventbus-with-spring-part-2.html 提供的代码注册了一个 EventBusRegisterBeanPostProcessor

这将扫描任何 bean 并将其注册到 EventBus。

要监听事件(订阅),我只需要创建一个如下所示的 POJO:

@Component
public class PingMessageReceivedHandler {

static Logger logger = Logger.getLogger(PingMessageReceivedHandler.class);

@Subscribe
public void handleMessageReceivedEvent(MessageReceivedEvent messageReceivedEvent) {
logger.info(messageReceivedEvent.getMessage());
messageReceivedEvent.getChannel().writeAndFlush(new BaseMessage(false, "Pong", null, ""));
}

}

现在,问题是:除非我在不同的服务或组件或其他任何地方的某个地方依赖于 PingMessageReceivedHandler (例如使用 @ Autowired),那么 EventBusRegisterBeanPostProcessor 将无法识别 PingMessageReceivedHandler,因此不会向其分派(dispatch)消息。

我知道 Spring 知道 PingMessageReceivedHandler 的存在,日志状态如下:

2013-11-04 17:35:05,391  INFO [main] (DefaultListableBeanFactory.java:596) - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@9695ed7: defining beans [[...],pingMessageReceivedHandler,[...],eventBusRegisterBeanPostProcessor]; root of factory hierarchy

对于造成这种情况的原因有什么想法,更重要的是,我如何解决它?

编辑:上下文配置:

@ComponentScan(value = "com.company.product")
@Configuration
public class DeviceManagerServerConfig {

@Bean
public static EventBusRegisterBeanPostProcessor eventBusRegisterBeanPostProcessor() {
return new EventBusRegisterBeanPostProcessor();
}

@Bean
public EventBus eventBus() {
return new EventBus("standard");
}
}

它的初始化使用:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(DeviceManagerServerConfig.class);
context.refresh();

最佳答案

问题是我试图初始化一个具有阻塞操作的 bean(TCP 套接字服务器)。

这阻止了 Spring 进一步的 bean 初始化,并导致了原始帖子中的问题。

即:

@Component
@Profile("default")
public class SocketServerImpl implements SocketServer {
/**
* Instantiates a new socket server.
*/
public SocketServerImpl() {
/* Standard stuff */
}


@PostConstruct
@Override
public void start() {
/* This would block any further progressing */
}
}

我的修复非常简单,我从上面的代码中删除了 @PostConstruct ,并在我调用 context.refresh( ),我调用了context.getBean(SocketServer.class).start()

关于java - 除非存在 @autowired 依赖项,否则 Spring 框架不会调用 BeanPostProcessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772764/

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