将@Service bean注入非spring类

时间:2018-09-01 20:37:17

标签: java spring dependency-injection

我有一个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个引用。我可以在上面为所有依赖项堆叠代码,或者可以创建 MessageHandler @Service类,并自动装配所有依赖项。

使 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());;
}

这可以使我免于代码冗余。但是,我不确定它的良好做法。

还有其他方法可以执行此操作吗? 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我习惯于创建一个非弹簧管理的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;
}

这受春天如何自动连接测试班的启发。