Внедрение бина @Service в класс без пружин - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть websocket-config:

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

И я сталкиваюсь со структурой Crysis. Как видите, класс MessageHandler не является классом @Service. Однако сам класс нуждается в ссылке на классы @Service. Я предоставляю ссылку для MessageHandler из контекста приложения, используя:

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

Однако классу требуется более 1 ссылки. Я мог бы просто сложить код выше для всех зависимостей, или я мог бы создать MessageHandler @Service class и автоматически связать все зависимости.

Maing MessageHandler @Service class я не смогу передать его в качестве аргумента в метод 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 голосов
/ 02 сентября 2018

Я использовал для создания 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;
}

Это вдохновлено тем, как пружина автоматически подключить тестовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...