1

Ich bin relativ neu zu EE/CDI für DI so vielleicht könnte einer von Ihnen mir einige Tipps für mein Problem geben:DI mit CDI und 3rd Party Klasse: vermeiden Sie Konstruktor macht Geschäftslogik mehrere Male für jede Proxy-Konstruktion genannt

Ich habe eine 3rd-Party-Klasse, die ich in andere Bohnen injizieren möchte. Im Frühjahr braucht nur noch eine <bean> Erklärung und es ist fertig. Mit cdi dauert es jetzt eine Fabrik Klasse:

public class XProducer {  
    @Produces 
    @ApplicationScoped 
    public X createX(){ 
     return new X(); 
    } 
} 

Unfortunatly X`s Konstruktor ruft ziemlich teuer Business-Logik und jedes Mal, wenn ein Proxy von cdi erstellt wird es genannt, aber ich kann nicht X Verhalten ändern. Dies lässt mich mit den folgenden Optionen, die ich nicht wirklich mag:

  • Verpackung X in einigen hässlichen Holder -Klasse,
  • eine Fassade zu schaffen und haben Methoden delgate zu X

Gibt es irgendwelche anderen Optionen übrig?

Antwort

2

Dies ist wahrscheinlich ein Fall, in dem Sie @javax.inject.Singleton seit seiner dritten Partei verwenden möchten, benötigen Sie keine Interceptor-Unterstützung und Singleton erzeugt keinen Proxy, so dass der Konstruktor nur einmal aufgerufen wird.

+0

Okay, mit EJB dann :) Ich ursprünglich abgelehnt '@ Singleton' wegen Container verwaltet Nebenläufigkeit einen Engpass zu schaffen, der es übersehen hat kann mit '@ConcurrencyManagement (BEAN)' deaktiviert werden. –

+0

Warum EJB? Wenn Sie '@ javax.inject.Singleton' verwenden, verwenden Sie JSR-330, nicht EJB. –