2016-07-04 13 views
1

Ist es möglich, @Autowired zu einer Klasse hinzuzufügen und auch einen Konstruktor zu der Klasse hinzuzufügen, die diese auto- wired Klassen nicht verwendet?Wie man Dienste außerhalb des Konstruktors autowire?

Beispiel:

public class MyJob { 
    @Autowired 
    private MyService1 serv1; 

    @Autowired 
    private MyService2 serv2; 

    public MyJob(String filename) { 
     this.filename = filename; 
    } 
} 

Hier möchte ich MyService1 und MyService2 für selbstverständlich nehmen, und initialisieren nur jene Klasse @Bean durch den Konstruktor:

@Bean 
public getMyJob1() { 
    return new MyJob("test1"); 
} 

@Bean 
public getMyJob2() { 
    return new MyJob("test2"); 
} 

Ist das möglich?

+1

Beachten Sie, dass Sie effektiv eine einfache Java-Klasse mit Mitgliedern erstellen, die nur instanziiert werden können eine Reflexion (d.h. kann nicht ohne Spring leben), so dass es schwierig ist, es zu testen. Warum injizieren Sie die Dienste nicht über den Konstruktor? – kryger

+0

Da, stell dir vor, ich möchte mehrere '@ Bean's Pb' MyJob' erstellen, und sie unterscheiden sich nur durch den Dateinamen. Dann müsste ich alle erforderlichen Dienste immer im Konstruktor hinzufügen, auch wenn sie immer gleich sind. – membersound

+0

Ich würde einen Setter für die Eigenschaft 'filename' verwenden –

Antwort

2

Ich denke, der beste Weg, um eine Fabrik für die MyJob der Instanzen zu machen ist:

public class MyJob { 
    @Autowired 
    private MyService1 serv1; 

    @Autowired 
    private MyService2 serv2; 

    private String filename; 

    public void setFilename(String filename) { 
     this.filename = filename; 
    } 

    // getter for filename 
} 

Und dann, in der:

public class MyJobFactory { 
    private MyService1 serv1;  
    private MyService2 serv2; 

    @Autowired 
    public MyJobFactory(MyService1 serv1, MyService2 serv2) { 
     this.serv1 = serv1; 
     this.serv2 = serv2; 
    } 

    public MyJob myJob(String filename) { 
     return new MyJob(filename, serv1, serv2); 
    } 
} 
+1

Ich könnte zustimmen, wenn Sie Konstruktor-Injektion für beide Abhängigkeiten verwenden würde :). –

0

Ich würde einfach einen Setter für die filename Eigenschaft Fabrikklasse:

@Bean 
public MyJob getMyJob1() { 
    MyJob job = new MyJob(); 
    job.setFilename("test1"); 
    return job; 
} 

@Bean 
public MyJob getMyJob2() { 
    MyJob job = new MyJob(); 
    job.setFilename("test2"); 
    return job; 
} 
+0

Ich würde sagen, das ist noch schlimmer, der 'Dateiname' ist für die ordnungsgemäße Funktion erforderlich. Erforderliche Eigenschaften sollten über den Konstruktor eingefügt werden, sodass Sie ein Objekt in einem ungültigen Zustand nicht erstellen können. –

+0

@ M.Deinum Das ist zu puristisch. In diesem Fall werden beide 'MyJob'-Instanzen erstellt und in einer Factory-Klasse * initialisiert (über '@ Bean'-Methoden). Wie in fast allem, desto einfacher, desto besser –

+0

Und Sie haben eine öffentliche Klasse mit einem öffentlichen Konstruktor, die nicht verhindert, dass jemand diese Klasse außerhalb Ihrer Fabrik instanziiert. Es hat nichts mit Purismus zu tun, es geht um das Design und die Einhaltung von OO Regeln/Prinzipien. –

Verwandte Themen