Ich habe ein paar Frühlingsbohnen, die über Anmerkungen vom Klassenpfad aufgenommen werden, z
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
In der Spring XML-Datei ist ein PropertyPlaceholderConfigurer definiert:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
Ich möchte eine der Eigenschaften von app.properites in die oben gezeigte Bean einfügen. Ich kann so etwas nicht einfach machen
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
Da PersonDaoImpl nicht in der Spring-XML-Datei enthalten ist (es wird über Anmerkungen aus dem Klassenpfad abgerufen). Ich bin bis zu folgendem gekommen:
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
Aber mir ist nicht klar, wie ich auf die Immobilie zugreife, an der ich interessiert bin ppc
?
java
spring
dependency-injection
Dónal
quelle
quelle
PropertyPlaceholderConfigurer
nicht mehr die empfohlene Klasse ist. LieberPropertySourcesPlaceholderConfigurer
stattdessen. In jedem Fall können Sie die kürzere XML-Definition verwenden<context:property-placeholder />
.Antworten:
Sie können dies in Spring 3 mithilfe der EL-Unterstützung tun. Beispiel:
systemProperties
ist ein implizites Objekt undstrategyBean
ein Bean-Name.Ein weiteres Beispiel, das funktioniert, wenn Sie eine Eigenschaft von einem
Properties
Objekt abrufen möchten . Es zeigt auch, dass Sie@Value
auf Felder anwenden können:Hier ist ein Blog-Beitrag, den ich darüber geschrieben habe, um ein bisschen mehr Informationen zu erhalten.
quelle
systemProperties
einfachSystem.getProperties()
? Ich denke, wenn ich meine eigenen Eigenschaften in eine Spring Bean injizieren möchte, muss ich einen<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
dann gelesenen Wert daraus in eine andere Bean mit etwas wie@Value("#{appProperties.databaseName}")
Persönlich liebe ich diesen neuen Weg in Spring 3.0 aus den Dokumenten :
Keine Getter oder Setter!
Mit den Eigenschaften, die über die Konfiguration geladen werden:
Um meine Freude zu fördern, kann ich sogar den Klick auf den EL-Ausdruck in IntelliJ steuern und komme zur Eigenschaftsdefinition!
Es gibt auch die völlig nicht XML-Version :
quelle
@Value
In Spring 3.0.0M3 gibt es eine neue Anmerkung .@Value
unterstützen nicht nur#{...}
Ausdrücke, sondern auch${...}
Platzhalterquelle
<context:property-placeholder ... />
ist das XML-Äquivalent zum PropertyPlaceholderConfigurer.Beispiel: applicationContext.xml
Komponentenklasse
quelle
<context:component-scan base-package="com.company.package" />
Als Referenz verwende ich spring über dasApplicationContext
, nicht in einem Webkontext .Eine andere Alternative ist das Hinzufügen der unten gezeigten appProperties-Bean:
Beim Abrufen kann diese Bean in eine umgewandelt
java.util.Properties
werden, die eine Eigenschaft mit dem Namen enthält, ausresults.max
deren Wert gelesen wirdapp.properties
. Auch diese Bean kann über die Annotation @Resource einer Abhängigkeit (als Instanz von java.util.Properties) in eine beliebige Klasse injiziert werden.Persönlich bevorzuge ich diese Lösung (gegenüber der anderen, die ich vorgeschlagen habe), da Sie genau einschränken können, welche Eigenschaften von appProperties verfügbar gemacht werden, und app.properties nicht zweimal lesen müssen.
quelle
Ich benötige zwei Eigenschaftendateien, eine für die Produktion und eine Überschreibung für die Entwicklung (die nicht bereitgestellt wird).
Um beides zu haben, eine Eigenschaften-Bean, die automatisch verdrahtet werden kann, und einen PropertyConfigurer, können Sie schreiben:
und verweisen Sie auf die Properties Bean im PropertyConfigurer
quelle
Bevor wir Spring 3 erhalten, mit dem Sie Eigenschaftskonstanten mithilfe von Anmerkungen direkt in Ihre Beans einfügen können, habe ich eine Unterklasse der PropertyPlaceholderConfigurer-Bean geschrieben, die dasselbe tut. So können Sie Ihre Immobiliensetter markieren und Spring verdrahtet Ihre Immobilien automatisch wie folgt in Ihre Bohnen:
Die Anmerkung lautet wie folgt:
Der PropertyAnnotationAndPlaceholderConfigurer lautet wie folgt:
Fühlen Sie sich frei, nach Geschmack zu ändern
quelle
Sie können Ihre Klasse auch mit Anmerkungen versehen:
Und haben Sie eine Variable wie diese:
Jetzt können Sie auf folgende Weise auf alle Ihre Immobilien zugreifen:
quelle
Frühlingsweg:
private @Value("${propertyName}") String propertyField;
ist eine neue Methode, um den Wert mithilfe der Spring-Klasse "PropertyPlaceholderConfigurer" einzufügen. Ein anderer Weg ist anzurufen
Hinweis: Für @Value können Sie das statische propertyField nicht verwenden . Es sollte nur nicht statisch sein, andernfalls wird null zurückgegeben. Um dies zu beheben, wird ein nicht statischer Setter für das statische Feld erstellt und @Value wird über diesem Setter angewendet.
quelle
Wie erwähnt
@Value
erledigt es die Arbeit und es ist ziemlich flexibel, da Sie Feder EL darin haben können.Hier einige Beispiele, die hilfreich sein könnten:
Ein anderer, um einen
set
von einem zu bekommenlist
Sie können auch Werte für primitive Typen festlegen.
Sie können statische Methoden aufrufen:
Sie können Logik haben
quelle
Eine mögliche Lösung besteht darin, eine zweite Bean zu deklarieren, die aus derselben Eigenschaftendatei liest:
Die Bean mit dem Namen 'appProperties' ist vom Typ java.util.Properties und kann mithilfe des oben gezeigten @ Resource-Attributs abhängig injiziert werden.
quelle
Wenn Sie mit Spring 2.5 nicht weiterkommen, können Sie für jede Ihrer Eigenschaften eine Bean definieren und diese mithilfe von Qualifikationsmerkmalen injizieren. So was:
und
Es ist nicht super lesbar, aber es erledigt den Job.
quelle
Autowiring-Eigenschaftswerte in Spring Beans:
Die meisten Leute wissen, dass Sie @Autowired verwenden können, um Spring anzuweisen, ein Objekt in ein anderes zu injizieren, wenn es Ihren Anwendungskontext lädt. Ein weniger bekanntes Nugget an Informationen ist, dass Sie auch die Annotation @Value verwenden können, um Werte aus einer Eigenschaftendatei in die Attribute einer Bean einzufügen. Weitere Informationen finden Sie in diesem Beitrag ...
neue Sachen im Frühjahr 3.0 || Autowiring Bean-Werte || Autowiring-Immobilienwerte im Frühjahr
quelle
Für mich war es die Antwort von @ Lucky und speziell die Zeile
von der Captain Debug Seite
das hat mein Problem behoben. Ich habe eine ApplicationContext-basierte App, die über die Befehlszeile ausgeführt wird. Nach einer Reihe von Kommentaren zu SO verdrahtet Spring diese anders als MVC-basierte Apps.
quelle
Ich denke, es ist am bequemsten, Eigenschaften in die Bean-Setter-Methode zu injizieren.
Beispiel:
Bean XML Definition:
Für jede benannte
property
MethodesetProperty(value)
wird aufgerufen.Diese Methode ist besonders hilfreich, wenn Sie mehr als eine Bean basierend auf einer Implementierung benötigen.
Wenn wir zum Beispiel eine weitere Bean in xml definieren:
Dann Code wie folgt:
Wird gedruckt
In Ihrem Fall sollte es also so aussehen:
quelle
Wenn Sie mehr Flexibilität für die Konfigurationen benötigen, versuchen Sie es mit dem Settings4jPlaceholderConfigurer: http://settings4j.sourceforge.net/currentrelease/configSpringPlaceholder.html
In unserer Anwendung verwenden wir:
Die Standardreihenfolge, in der die Schlüsselwertquelle zuerst überprüft wird, ist beschrieben in:
http://settings4j.sourceforge.net/currentrelease/configDefault.html
Adresse Sie kann mit einer settings4j.xml (genau auf log4j.xml) in Ihrem angepasst werden Klassenpfad.
Teilen Sie mir Ihre Meinung mit: [email protected]
mit freundlichen Grüßen,
Harald
quelle
Verwenden Sie die Spring-Klasse "PropertyPlaceholderConfigurer"
Ein einfaches Beispiel, in dem die Eigenschaftendatei dynamisch als Bean-Eigenschaft gelesen wird
Eigenschaftendatei
dev.app.jdbc.driver = com.mysql.jdbc.Driver
dev.app.jdbc.url = jdbc: mysql: // localhost: 3306 / addvertisement
dev.app.jdbc.username = root
dev.app.jdbc.password = root
quelle