2017-01-16 3 views
0

Ich verwende Spring Framework für Dependency Injection. An einer Stelle injiziere ich eine Instanz einer bestimmten Klasse in eine andere Klasse und ich muss ein zusätzliches temporäres Objekt derselben Klasse erstellen. Ich könnte wahrscheinlich den Umfang der injizierten Bean zum Prototyp ändern, aber ich frage mich, ob es noch eine andere einfache Möglichkeit gibt, das zu tun?So erstellen Sie manuell eine Klasseninstanz mit Spring

Meine einzige Idee ist, es unter Verwendung new zu erstellen, aber wollte wissen, ob es eine richtige Möglichkeit gibt, es mit Spring zu machen.

Nur ein allgemeines Beispiel:

@Inject 
private ClassA classA; 

public void methodA() { 

// here I need another instance of ClassA to be used in the scope of this method 

} 
+0

Was ist der Zweck dieser "temporären" Klasse? Brauchen Sie stattdessen eine Prototyp-Bean? – chrylis

+0

@chrylis Ich verwende Spring für mein automatisiertes Testframework, daher ist es wahrscheinlich nicht die klassische Spring-Verwendung. In meinem Fall repräsentiert dieses Objekt ein logisches Element in der Anwendung, die ich gerade teste, und hier muss ich ein zusätzliches Element einkapseln, das nur innerhalb dieser Methode relevant ist. Hoffnung, die Sinn macht. –

+0

Der Prototypumfang und 'ApplicationContext' sind alles, was Sie brauchen –

Antwort

-4

Es gibt zwei Möglichkeiten, dies auf der Grundlage der Zweck einer anderen Instanz von KlasseA tun können. Erstens, Sie können ein neues Objekt mit dem Schlüsselwort "new" erstellen.

public void methodA() 
{ 
ClassA antherClassAInstance = new ClassA(); 
} 

Diese Vorgehensweise ist geeignet, wenn Sie die neue Instanz nur für diese Methode verwenden möchten.

Zweite, Deklarieren Sie globale Instanz mit @Autowired Annotation.

@Autowired 
ClassA antherClassAInstance; 
+0

@Autowired wird die gleiche Funktionalität bieten wie @Inject, die ich gerade verwende. Es wird das Singleton verdrahten. Ich erwähnte auch, dass die Verwendung von "neu" meine zweite Option ist, aber ich wollte wissen, ob es Alternativen gibt. –

+0

Können Sie mir den Zweck der neuen Instanz mitteilen? Sie können die erste Instanz klonen, wenn Sie möchten. –

+0

Bitte lesen Sie meine Kommentare zur ursprünglichen Frage. –

1

Unterklasse einfach und verwenden Sie Bereich.

@Component 
@Scope("prototype") 
public class ClassB extends ClassA { 
} 

Dann, es zu benutzen:

@Autowired 
private ApplicationContext context; 

public void methodA(){ 
    // will return a new instance (still a bean) every time its called 
    ClassB bean = context.getBean(ClassB.class); 
    ... 
} 

Sie können auch auf ClassA niederschlagen und Bohnennamen verwenden, wenn Sie möchten.

+0

Danke für Ihre Eingabe. Es ist ein interessanter Ansatz. Nach dem, was ich weiß, ist die direkte Verwendung von "getBean" eine schlechte Übung. –

+0

'getBean' ist eine vollkommen gewöhnliche Methode, um engere Scope-Beans (wie eine Anfrage, einen Prototyp) innerhalb breiterer Beans (wie Singleton) zu erhalten. Wenn Sie es nicht verwenden möchten, ist die einzige Option die Verwendung von [abhängige Beacons als Abhängigkeiten] (https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans. html # beans-factory-scopes-other-injection), die aop-Proxies benötigt, was unpraktisch und fehleranfällig ist (besonders mit dem Umfang des Prototyps). Denken Sie daran, dass Sie beim Erstellen von Beans mit injizierten (autowired) Feldern ** kein neues Schlüsselwort verwenden sollten. – bekce

+0

Nicht sehr nette Annäherung. Es macht Ihre Klasse abhängig vom gesamten applicationContext. Schlechtes Design und schwer zu testen, weil man den ganzen Kontext überspielen sollte. In diesem Fall ist es besser, Factory-Bean zu verwenden. –

Verwandte Themen