Ich weiß, dass dies wie eine zuvor gestellte Frage aussieht, aber ich stehe hier vor einem anderen Problem.
Ich habe eine Utility-Klasse, die nur statische Methoden hat. Ich nicht und ich werde keine Instanz daraus nehmen.
public class Utils{
private static Properties dataBaseAttr;
public static void methodA(){
}
public static void methodB(){
}
}
Jetzt brauche ich Spring, um dataBaseAttr mit Datenbankattributen zu füllen. Properties.Spring config is:
<?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>
Ich habe es bereits in anderen Beans gemacht, aber das Problem hier in dieser Klasse (Utils) ist keine Bean. Und wenn ich es zu einer Bean mache, ändert sich nichts. Ich kann die Variable immer noch nicht verwenden, da die Klasse nicht immer instanziiert und variabel ist gleich null.
quelle
staticMethod
ist eine Eigenschaft vonMethodInvokingFactoryBean
und wird mit dem vollständig qualifizierten statischen Methodennamen konfiguriert. Der Wunsch wird mit den für die Eigenschaft angegebenen Argumenten aufgerufenargument
.Ich hatte eine ähnliche Anforderung: Ich musste eine von Spring verwaltete Repository-Bean in meine
Person
Entitätsklasse einfügen ("Entität" wie in "Etwas mit einer Identität", zum Beispiel eine JPA-Entität). EinePerson
Instanz hat Freunde, und damit diesePerson
Instanz ihre Freunde zurückgibt, delegiert sie an ihr Repository und fragt dort nach Freunden ab.@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 } ... }
Wie habe ich diesen
PersonRepository
Singleton in das statische Feld derPerson
Klasse eingefügt ?Ich habe eine erstellt
@Configuration
, die zur Erstellungszeit von Spring ApplicationContext abgeholt wird . Dies@Configuration
wird mit all den Beans injiziert, die ich als statische Felder in andere Klassen injizieren muss. Dann@PostConstruct
fange ich mit einer Anmerkung einen Haken, um die gesamte Logik der statischen Feldinjektion auszuführen.@Configuration public class StaticFieldInjectionConfiguration { @Inject private PersonRepository personRepository; @PostConstruct private void init() { Person.setPersonRepository(personRepository); } }
quelle
Da diese Antworten alt sind, habe ich diese Alternative gefunden. Es ist sehr sauber und funktioniert nur mit Java-Anmerkungen:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class GlobalValue { public static String DATABASE; @Value("${mongodb.db}") public void setDatabase(String db) { DATABASE = db; } }
https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/
quelle