将@Service bean注入非spring类

问题描述 投票:0回答:1

我有一个websocket-config:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MessageHandler(), "/websocket")
                .setAllowedOrigins("*")
                .addInterceptors(new HttpSessionIdHandshakeInterceptor());;
    }
}

我正面临着结构性的孤岛危机。如您所见,MessageHandler类不是@Service类。但是类本身需要引用@Service类。我使用以下命令从应用程序上下文提供MessageHandler的引用:

ApplicationContext context = WebSocketService.getAppContext();
WebSocketService webSocketService= (WebSocketService) context.getBean("webSocketService");

但是,该类需要超过1个引用。我可以只为所有依赖项堆叠代码,或者我可以创建Message Handler @Service类,并自动装配所有依赖项。

Maing MessageHandler @Service类我将无法将其作为参数传递给addHandler()方法。但是我能做到:

public MessageHandler getHandler(){
    ApplicationContext context = WebSocketService.getAppContext();
    return (MessageHandler) context.getBean("messageHandler");
}

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(getHandler(), "/websocket")
            .setAllowedOrigins("*")
            .addInterceptors(new HttpSessionIdHandshakeInterceptor());;
}

这可以节省我的代码冗余。然而,我觉得不确定,不管它的良好做法。

有没有其他方法如何做到这一点还是我坚持这个?感谢帮助!

java spring dependency-injection
1个回答
0
投票

我习惯于创建一个非spring管理的bean:

public CreateOrderCommand createOrderCommand(Integer userId, Integer productId, Integer count) {
    CreateOrderCommand command = new CreateOrderCommand();
    command.setProductId(productId);
    command.setUserId(userId);
    command.setBuyCount(count);
    context.getAutowireCapableBeanFactory().autowireBean(command);
    context.getAutowireCapableBeanFactory().initializeBean(command, command.getClass().getName());
    return command;
}

这是受弹簧如何自动测试类的启发。

© www.soinside.com 2019 - 2024. All rights reserved.