2013-08-26 15 views
16

Sto provando a iniettare un bean java.util.prefs.Preferences nel mio controller master. Il controller si presenta come:Come iniettare il bean Spring per il metodo factory che richiede il parametro MyClass.class

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

Il file-context.xml crea il fagiolo per java.util.prefs.Preferences. Esso utilizza un metodo di fabbrica in modo ho la seguente voce per la creazione del fagiolo:

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

Preferences.userNodeForPackage (param) prende per un parametro della classe relativi alla preferenza. In questo caso primavera ha bisogno di creare il fagiolo effettuando la chiamata:

Preferences.userNodeForPackage(MyController.class); 

Come può una classe di essere passato a un fagiolo primavera istanziato con un metodo factory? Grazie

informazioni Ambiente:

Java 7 
Spring 3.1 

risposta

22

È possibile specificare l'elemento constructor-arg

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

Questo è spiegato nella documentazione ufficiale here, sezione 5.4.1.

argomenti al metodo factory statico vengono alimentati tramite elementi, esattamente come se fosse un costruttore stato effettivamente utilizzato. Il tipo della classe restituita dal metodo factory non deve essere dello stesso tipo della classe che contiene il metodo factory statico, sebbene in questo esempio lo sia. Un metodo di produzione di istanza (non statico) verrebbe utilizzato in modo sostanzialmente identico a (a parte l'attributo factory-bean invece dell'attributo class), quindi i dettagli non verranno discussi qui.

+0

ha bisogno di fornire argomenti come parametro 'userNodeForPackage()' metodo, non il costruttore di 'Preferences' –

+2

@NandkumarTekale Leggere la citazione e la documentazione. È così che lo fai quando hai specificato l'attributo 'factory-method'. –

+0

+1 buono. :) –

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> 

Si prega di vedere il riferimento

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

-1

Puoi provare a fare "preferenze" di proprietà di "MyController". Qualcosa come

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

e quindi avere il getter e setter per le preferenze metodo in MyController.

Penso che questo dovrebbe funzionare.

+1

Il problema dell'OP non sta automatizzando l'oggetto. Il problema sta specificando e argomentando su un metodo statico di fabbrica. –

3

Beh, non conosco il modo di configurazione basato su XML ma posso dirti come è possibile creare un'istanza tramite la classe Configuration.

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

P.S. :

Sarà necessario aggiungere la classe di configurazione/pacchetto per la scansione nel web.xml se si utilizza completo approccio basato annotazione [contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext] o nel file di configurazione, come di seguito:

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

+1 occhio per occhio: p –

+0

+1 Probabilmente nella tua risposta dovresti accennare al manufatto di contesto primaverile di Maven. –

0

prima creare il fagiolo di classe 'Preferenze' sia utilizzando file XML o mediante annotazione.
allora è possibile utilizzare questo <context:annotation-config> se è stato creato utilizzando fagioli di configurazione XML per attivare la funzionalità di annotazione @Autowired
(o)

<context:component-scan base-package="com.estudo.controller" />
se è stato creato utilizzando le annotazioni di fagioli.
Nota: definire i tag sopra riportati nel file xml servlet molla

0

La struttura a molla consente di iniettare il fagiolo utilizzando il metodo di fabbrica. Per fare ciò, possiamo usare due attributi dell'elemento bean.

metodo-factory: rappresenta il metodo factory che verrà invocato per iniettare il bean. factory-bean: rappresenta il riferimento del bean con cui verrà invocato il metodo factory. Viene utilizzato se il metodo factory non è statico. Un metodo che restituisce l'istanza di una classe è chiamato metodo factory.

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