Mam kilka wiosennych ziaren, które są zbierane ze ścieżki klas za pomocą adnotacji, np
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
W wiosennym pliku XML zdefiniowano właściwość PropertyPlaceholderConfigurer :
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
Chcę wstrzyknąć jedną z właściwości app.properites do pokazanego powyżej komponentu bean. Nie mogę po prostu zrobić czegoś takiego
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
Ponieważ PersonockeyImpl nie występuje w pliku Spring XML (jest pobierany ze ścieżki klas za pomocą adnotacji). Mam do tego, co następuje:
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
Ale nie jest dla mnie jasne, jak uzyskać dostęp do nieruchomości, która mnie interesuje ppc
?
java
spring
dependency-injection
Dónal
źródło
źródło
PropertyPlaceholderConfigurer
nie jest już zalecaną klasą. WolęPropertySourcesPlaceholderConfigurer
zamiast tego. W każdym razie możesz użyć krótszej definicji XML<context:property-placeholder />
.Odpowiedzi:
Możesz to zrobić wiosną 3, korzystając ze wsparcia EL. Przykład:
systemProperties
jest niejawnym przedmiotem istrategyBean
jest nazwą fasoli.Jeszcze jeden przykład, który działa, gdy chcesz pobrać właściwość z
Properties
obiektu. Pokazuje także, że możesz zastosować@Value
do pól:Oto post na blogu , o którym napisałem, aby uzyskać więcej informacji.
źródło
systemProperties
po prostuSystem.getProperties()
? Myślę, że jeśli chcę wstrzyknąć własne właściwości do fasoli wiosennej, muszę zdefiniować<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
wartości odczytane z tej fasoli do innej fasoli, używając czegoś takiego@Value("#{appProperties.databaseName}")
Osobiście uwielbiam ten nowy sposób w Spring 3.0 z dokumentacji :
Żadnych pobierających ani ustawiających!
Z właściwościami ładowanymi przez config:
Aby pogłębić moją radość, mogę nawet kontrolować kliknięcie wyrażenia EL w IntelliJ i przenosi mnie do definicji właściwości!
Istnieje również całkowicie inna wersja XML :
źródło
Dodano nową adnotację
@Value
do Spring 3.0.0M3 .@Value
obsługują nie tylko#{...}
wyrażenia, ale także${...}
symbole zastępczeźródło
<context:property-placeholder ... />
jest odpowiednikiem XML właściwości PropertyPlaceholderConfigurer.Przykład: applicationContext.xml
Klasa komponentów
źródło
<context:component-scan base-package="com.company.package" />
W celach informacyjnych używam sprężyny za pośrednictwemApplicationContext
, a nie w kontekście sieciowym.Inną alternatywą jest dodanie fasoli appProperties pokazanej poniżej:
Po pobraniu, ta fasola może być rzutowana na
java.util.Properties
właściwość, która będzie zawierać nazwęresults.max
o nazwie, z której odczytana jest wartośćapp.properties
. Znów ta fasola może być wstrzykiwana w zależności (jako instancja java.util.Properties) do dowolnej klasy za pomocą adnotacji @Resource.Osobiście wolę to rozwiązanie (od drugiego, które zaproponowałem), ponieważ możesz ograniczyć dokładnie, które właściwości są udostępniane przez appProperties, i nie musisz dwa razy czytać app.properties.
źródło
Muszę mieć dwa pliki właściwości, jeden dla produkcji i zastąpienie dla rozwoju (które nie zostanie wdrożone).
Aby mieć oba elementy, Bean właściwości, które można autowiredować oraz PropertyConfigurer, możesz napisać:
i odwołaj się do właściwości Bean w PropertyConfigurer
źródło
Zanim otrzymamy Spring 3 - który pozwala ci wstrzykiwać stałe właściwości bezpośrednio do ziaren za pomocą adnotacji - napisałem podklasę fasoli PropertyPlaceholderConfigurer, która robi to samo. Możesz więc oznaczyć osoby ustawiające właściwości, a Spring automatycznie zapisze twoje właściwości w fasoli w następujący sposób:
Adnotacja wygląda następująco:
Właściwość PropertyAnnotationAndPlaceholderConfigurer wygląda następująco:
Zmodyfikuj do smaku
źródło
Możesz także dodać adnotację do swojej klasy:
I mieć zmienną taką jak ta:
Teraz możesz uzyskać dostęp do wszystkich swoich nieruchomości w ten sposób:
źródło
Wiosna sposób:
private @Value("${propertyName}") String propertyField;
to nowy sposób wprowadzania wartości za pomocą klasy Spring „PropertyPlaceholderConfigurer”. Innym sposobem jest zadzwonić
Uwaga: W przypadku @Value, nie można używać statycznego propertyField, powinno być tylko non-static, w przeciwnym wypadku zwraca NULL. Aby to naprawić, dla pola statycznego tworzony jest niestacjonarny setter, a nad tym selektorem stosowana jest wartość @Value.
źródło
Jak wspomniano
@Value
, praca jest dość elastyczna, ponieważ można w niej sprężynować EL.Oto kilka przykładów, które mogą być pomocne:
Kolejny do zdobycia
set
odlist
Możesz także ustawić wartości dla typów pierwotnych.
Możesz wywoływać metody statyczne:
Możesz mieć logikę
źródło
Możliwym rozwiązaniem jest zadeklarowanie drugiego komponentu bean, który czyta z tego samego pliku właściwości:
Fasola o nazwie „appProperties” jest typu java.util.Properties i może być wstrzykiwana w zależności za pomocą powyższego atrybutu @Resource attruibute.
źródło
Jeśli utkniesz przy użyciu Spring 2.5, możesz zdefiniować fasolę dla każdej ze swoich właściwości i wstrzyknąć ją za pomocą kwalifikatorów. Lubię to:
i
Nie jest bardzo czytelny, ale wykonuje zadanie.
źródło
Autowiring wartości nieruchomości w fasoli wiosennej:
Większość ludzi wie, że możesz użyć @Autowired, aby powiedzieć Springowi, aby wstrzyknął jeden obiekt w inny, gdy ładuje kontekst aplikacji. Mniej znanym modelem użytkowym informacji jest to, że można również użyć adnotacji @Value, aby wstrzyknąć wartości z pliku właściwości do atrybutów komponentu bean. zobacz ten post, aby uzyskać więcej informacji ...
nowe rzeczy wiosną 3.0 || wartości fasoli autowiringowej || wartości właściwości autowiring na wiosnę
źródło
Dla mnie była to odpowiedź @ Lucky'ego, a konkretnie linia
ze strony debugowania kapitana
to naprawiło mój problem. Mam aplikację opartą na ApplicationContext uruchomioną z wiersza polecenia i sądząc po wielu komentarzach na temat SO, Spring łączy je inaczej niż aplikacje oparte na MVC.
źródło
Myślę, że najwygodniejszym sposobem na wstrzyknięcie właściwości fasoli jest metoda ustawiająca.
Przykład:
Definicja xml fasoli:
Dla każdej nazwanej
property
metodysetProperty(value)
zostanie wywołana.Ten sposób jest szczególnie pomocny, jeśli potrzebujesz więcej niż jednego komponentu bean w oparciu o jedną implementację.
Na przykład, jeśli zdefiniujemy jeszcze jedną fasolę w xml:
Następnie kod w ten sposób:
Wydrukuje
W twoim przypadku powinno to wyglądać tak:
źródło
Jeśli potrzebujesz większej elastyczności dla konfiguracji, wypróbuj Settings4jPlaceholderConfigurer: http://settings4j.sourceforge.net/currentrelease/configSpringPlaceholder.html
W naszej aplikacji używamy:
Domyślna kolejność, w której klucz-wartość-źródło jest sprawdzana jako pierwsza, została opisana w:
http://settings4j.sourceforge.net/currentrelease/configDefault.html
Można ją dostosować za pomocą ustawienia4j.xml (dokładny do log4j.xml) w swoim ścieżka klasy.
Daj mi znać swoją opinię: [email protected]
z poważaniem
Harald
źródło
Użyj klasy „PropertyPlaceholderConfigurer” Springa
Prosty przykład pokazujący plik właściwości odczytywany dynamicznie jako właściwość komponentu bean
Plik właściwości
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
źródło