2016-10-25 5 views
0

Ich habe eine Klasse:Spring-Bean Teil autowire Prototyp Konstruktor

@Slf4j 
@Component 
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) 
public class WebSocketRegistrar extends AbstractWebSocketHandler{ 


    private final ApplicationContext context; 



    @Override 
    public void afterConnectionEstablished(WebSocketSession session) throws Exception { 
     // problem here. 
     context.getBean(WebSocketConsumer.class, session); 
    } 

    @Override 
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { 

    } 

} 

und es versucht, einen Prototyp Bohne zu schaffen, wo 1 des Parameters ist ein Runtime-Argument und der Rest hat ich injiziert werden soll. Ich brauche es, um den EventBus und eine Funktion zu nehmen. Beide sind im Kontext verfügbar und ich kann dieses Problem umgehen. Ich versuche zu verstehen, wie ich Teil-Konstruktor autowiring an einem Prototyp tun kann

@Component 
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
@NoArgsConstructor 
public class WebSocketConsumer implements Consumer<Identifiable<?>> { 

    private WebSocketSession session; 

    private Function<Identifiable<?>, String> jsonApi; 

    @Autowired 
    public WebSocketConsumer(WebSocketSession session, EventBus bus, BiFunction<Identifiable<?>, String, String> toJsonApi) { 
     this.session = session; 
     this.jsonApi = identifiable -> toJsonApi.apply(identifiable,session.getHandshakeHeaders().get("Host").get(0)); 
     bus.on(R(session.getUri().getPath() + "/?.*"),this::accept); 

    } 


    @Override 
    public void accept(Identifiable<?> update) { 

    } 

} 

Antwort

1

Ich glaube, Sie könnten Ihre Frage neu zu formulieren müssen, entweder fragen Sie einen Kampf ein sehr minimal Beispiel dafür, was man im Frühjahr erreichen will, oder Fragen Sie einfach nach dem puren Spring DI-Problem, das Sie haben. Aber wie auch immer auf der Injektionsfeder Abhängigkeit Seite klingt es wie was Sie brauchen, ist eine Konfiguration, die Sie erstellen können, Bohnen aus:

@Configuration 
public class TestConfiguration { 

    @Bean 
    @Autowired 
    @Scope("prototype") 
    public SomePrototypeBean createBean(SingletonBean singletonBean){ 
      return new SomePrototypeBean(singletonBean, "TODO whatever you want here"); 
    } 
} 

diese Weise erhalten Sie eine bessere Kontrolle über den Konstruktor Argumente gehen in die Bohne und kann setzen In Singleton-Beans im Konstruktor und einer Art Argument, das sich zur Laufzeit ändert, habe ich es als TODO belassen. Unter allen Umständen vermeiden Sie context.getBean. Wenn Sie solche Dinge tun, müssen Sie vielleicht darüber nachdenken, wie Sie etwas erreichen wollen. Es sollte nur verwendet werden, um eine Beschränkung des Rahmens zu überwinden, wenn eine andere Lösung existiert, ist es vorzuziehen.

+0

Ich habe gerade entschuldigt gefunden, dass es nicht die beste Idee sein kann, um Bohnen in der Konfiguration zu autowire, dieser Beitrag geht in Details darüber, was zu tun ist http://stackoverflow.com/questions/28747743/autowire-a-bean- in-springs-java-configuration – Snickers3192

+0

Ich habe meine Antwort bearbeitet, das sollte nun was zu tun sein. – Snickers3192

Verwandte Themen