2012-07-04 12 views
55

So che questo potrebbe sembrare una domanda precedente ma sto affrontando un problema diverso qui.Come rendere il valore della molla iniettata in un campo statico

Ho una classe di utilità che ha solo metodi statici. Io no e non ne prenderò un'istanza.

public class Utils{ 
    private static Properties dataBaseAttr; 
    public static void methodA(){ 

    } 

    public static void methodB(){ 

    } 
} 

Ora ho bisogno di riempire primavera dataBaseAttr con il database attributi Properties.Spring config è:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

<util:properties id="dataBaseAttr" 
     location="file:#{classPathVariable.path}/dataBaseAttr.properties" /> 
</beans> 

ho già fatto in altri fagioli, ma il problema qui, in questa classe (Utils) non è un bean, E se lo faccio un bean non cambia nulla Non riesco ancora a usare la variabile dato che la classe non sarà istanziata e la variabile è sempre uguale a null.

risposta

93

Avete due possibilità:

  1. setter non statica per Proprietà statica/campo;
  2. utilizzando org.springframework.beans.factory.config.MethodInvokingFactoryBean per richiamare un setter statico.

Nella prima opzione si dispone di un bean con un setter regolare, ma invece di impostare una proprietà di istanza si imposta la proprietà/campo statico.

public void setTheProperty(Object value) { 
    foo.bar.Class.STATIC_VALUE = value; 
} 

ma per fare questo è necessario disporre di un'istanza di un fagiolo che esporrà questo setter (è più come una soluzione ).

Nel secondo caso sarebbe stato fatto come segue:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="staticMethod" value="foo.bar.Class.setTheProperty"/> 
    <property name="arguments"> 
     <list> 
      <ref bean="theProperty"/> 
     </list> 
    </property> 
</bean> 

Su di te caso sarà aggiungere un nuovo setter sulla classe Utils:

public static setDataBaseAttr(Properties p) 

e nella vostra contesto lo configurerai con l'approccio esemplificato sopra, più o meno come:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="staticMethod" value="foo.bar.Utils.setDataBaseAttr"/> 
    <property name="arguments"> 
     <list> 
      <ref bean="dataBaseAttr"/> 
     </list> 
    </property> 
</bean> 
+0

Grazie mille, hai davvero salvato la mia giornata. –

+0

siete i benvenuti! –

+0

Non ho provato la prima soluzione poiché non l'ho capita bene. Ho provato la seconda soluzione e ha funzionato alla grande. –

20

Ho avuto un requisito simile: avevo bisogno di iniettare un bean repository gestito Primavera-nella mia Person classe di entità ("entità" come in "qualcosa con un'identità", per esempio un'entità JPA) . Un'istanza Person ha amici, e per questa istanza Person per restituire i suoi amici, delegherà al suo repository e interrogherà gli amici lì.

@Entity 
public class Person { 
    private static PersonRepository personRepository; 

    @Id 
    @GeneratedValue 
    private long id; 

    public static void setPersonRepository(PersonRepository personRepository){ 
     this.personRepository = personRepository; 
    } 

    public Set<Person> getFriends(){ 
     return personRepository.getFriends(id); 
    } 

    ... 
} 

.

@Repository 
public class PersonRepository { 

    public Person get Person(long id) { 
     // do database-related stuff 
    } 

    public Set<Person> getFriends(long id) { 
     // do database-related stuff 
    } 

    ... 
} 

Quindi, come ho fatto a inietto che PersonRepository Singleton nel campo statico della classe Person?

Ho creato uno @Configuration, che viene prelevato a Spring ApplicationContext tempo di costruzione.Questo @Configuration viene iniettato con tutti quei bean che ho bisogno di iniettare come campi statici in altre classi. Quindi con un'annotazione @PostConstruct, prendo un amo per fare tutta la logica di iniezione di campo statico.

@Configuration 
public class StaticFieldInjectionConfiguration { 

    @Inject 
    private PersonRepository personRepository; 

    @PostConstruct 
    private void init() { 
     Person.setPersonRepository(personRepository); 
    } 
} 
+0

Come è possibile che sia possibile accedervi da un metodo statico? Non credo che questo sia possibile a tutti! Non dovrebbe essere Person.personRepository = personRepository? –

+3

@JonasGeiregat è possibile in quanto il metodo è statico e sta accedendo alla variabile statica –

+3

Mi chiedo come qualcuno faccia riferimento a una variabile statica attraverso "questo" in un contesto statico? – Kripz

Problemi correlati