2013-08-26 10 views
16

erfordert injizieren Ich versuche, eine Bean java.util.prefs.Preferences in meinem Master-Controller zu injizieren. Der Controller sieht aus wie:Wie Spring Bean für Factory-Methode, die MyClass.class-Parameter

@Controller 
class MyController { 
    @Autowired 
    private Preferences preferences; 
} 

Die anwendungs ​​context.xml Datei die Bohne für java.util.prefs.Preferences schafft. Es verwendet eine Factory-Methode, damit ich den folgenden Eintrag für die Erstellung der Bohne haben:

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" /> 

Preferences.userNodeForPackage (param) nimmt für einen Parameter die Klasse auf die Vorlieben zusammen. In diesem Fall muss Frühling die Bohne erstellen, indem Sie den Anruf durchführen:

Preferences.userNodeForPackage(MyController.class); 

Wie kann eine Klasse in eine Feder Bohne mit einer Factory-Methode instanziiert übergeben werden? Dank

Umweltinformationen:

Java 7 
Spring 3.1 

Antwort

22

können Sie geben das constructor-arg Element

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage"> 
    <constructor-arg type="java.lang.Class" value="com.path.MyController" /> 
</bean> 

Die in der offiziellen Dokumentation erklärt here, Abschnitt 5.4.1.

Argumente auf die statische Factory-Methode werden über Elemente geliefert, genau das gleiche wie wenn ein Konstruktor hatte tatsächlich verwendet worden. Der Typ der Klasse, die von der Factory-Methode zurückgegeben wird, muss nicht vom selben Typ sein wie die Klasse, die die statische Factory-Methode enthält, obwohl es in diesem Beispiel ist. Eine Instanz (nicht statische) Factory-Methode würde in einer im Wesentlichen identischen Art und Weise verwendet werden (abgesehen von der Verwendung der Factory-Bean-Attribut anstelle der Klasse Attribut), so dass Details hier nicht diskutiert werden .

+0

Er braucht Argument als Parameter 'userNodeForPackage zur Verfügung zu stellen()' Methode, nicht Konstruktor von 'Preferences' –

+2

das Angebot und die Dokumentation @NandkumarTekale zu lesen. So machen Sie es, wenn Sie das Attribut 'factory-method' angegeben haben. –

+0

+1 gute Eins. :) –

2
public class Preferences 
{ 
    SomeBean someBean; 

    public void setSomeBean(SomeBean someBean){ 
      this.someBean = someBean; 
    } 

    public static Preferences createSampleBeanWithIntValue(SomeBean someBean) 
    { 
     Preferences preferences= new Preferences(); 
     preferences.setSomeBean(someBean); 
     return preferences; 
    } 
} 

    <bean id="someBean" class="java.util.prefs.SomeBean"/> 

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" > 

    <constructor-arg ref="someBean "/>  
</bean> 

Bitte beachten Sie die Referenz

http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/

-1

Können Sie versuchen, "Einstellungen" eine Eigenschaft von "MyController" zu machen. So etwas wie

<bean id="MyController" class="com.your.package.MyController"> 
    <property name="preferences" ref="preferences" /> 
</bean> 

und haben dann die Getter und Setter-Methode für Präferenzen in MyController.

Ich denke, das sollte funktionieren.

+1

Das Problem von OP besteht darin, das Objekt nicht automatisch ablaufen zu lassen. Das Problem besteht darin, eine statische Factory-Methode anzugeben und zu argumentieren. –

3

Nun, ich kenne nicht die XML-basierte Konfiguration, aber ich kann Ihnen sagen, wie Sie es über Configuration Klasse instanziieren können.

@Configuration 
public class Config { 
    @Bean(name="preferences") 
    public java.util.prefs.Preferences preferences() { 
     // init 
     return java.util.prefs.Preferences.userNodeForPackage(YourExpectedClass.class); 
    } 
} 

P.S. :

Sie müssen Ihre Konfigurationsklasse/-paket zum Scannen entweder im Web hinzufügen.xml, wenn Sie mit kompletter Annotation basierten Ansatz [contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext] oder in Ihrer Konfigurationsdatei wie folgt:

<context:component-scan base-package="com.comp.prod.conf" /> 
+0

+1 Auge um Auge: p –

+0

+1 Sollte wahrscheinlich in Ihrer Antwort erwähnen, kommt es aus dem Frühjahr-Kontext Artefakt in Maven. –

0

zuerst erstellen die Bohne von ‚Einstellungen‘ Klasse entweder über XML-Datei oder eine Anmerkung verwenden.
dann können Sie diese <context:annotation-config> verwenden, wenn Sie Bean mit Hilfe von XML-Konfiguration erstellt der @Autowired Annotation Funktionalität
(oder)

<context:component-scan base-package="com.estudo.controller" />
zu aktivieren, wenn Sie Bean mit Anmerkungen erstellt.
Hinweis: Definieren Sie die obigen Tags in der Spring-Servlet-XML-Datei

0

Spring-Framework bietet die Möglichkeit, Bean mit Factory-Methode zu injizieren. Um dies zu tun, können wir zwei Attribute des Bean-Elements verwenden.

factory-method: stellt die Factory-Methode dar, die aufgerufen wird, um die Bean zu injizieren. factory-bean: stellt die Referenz der Bean dar, nach der die Factory-Methode aufgerufen wird. Es wird verwendet, wenn die Factory-Methode nicht statisch ist. Eine Methode, die die Instanz einer Klasse zurückgibt, heißt Factory-Methode.

public class A { 
public static A getA(){//factory method 
    return new A(); 
} 
} 
Verwandte Themen