de-vraag
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
 Dónal
Dónal
Question

Ako môžem injektovať hodnotu vlastnosti do Spring Bean, ktorá bola nakonfigurovaná pomocou anotácií?

Mám niekoľko Spring beans, ktoré sa vyberajú z classpath pomocou anotácií, napr.

@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
    // Implementation omitted
}

V súbore Spring XML je definovaný PropertyPlaceholderConfigurer:

<bean id="propertyConfigurer" 
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="/WEB-INF/app.properties" />
</bean>   

Chcem injektovať jednu z vlastností z app.properites do fazule uvedenej vyššie. Nemôžem jednoducho urobiť niečo ako

<bean class="com.example.PersonDaoImpl">
    <property name="maxResults" value="${results.max}"/>
</bean>

Pretože PersonDaoImpl sa nenachádza v súbore Spring XML (vyberá sa z classpath prostredníctvom anotácií). Dostal som sa až k nasledujúcemu:

@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 je mi jasné, ako sa dostanem k vlastnosti, ktorá ma'zaujíma z ppc?

283 2008-11-25T15:22:34+00:00 3
Peter Mularien
Peter Mularien
Edited question 25 január 2013 в 3:05
Programovanie
dependency-injection
java
spring
This question has 1 odpoveď in English, to read them log in to your account.
 D&#243;nal
Dónal
25 november 2008 в 5:25
2008-11-25T17:25:27+00:00
Viac na
Zdroj
Upraviť
#8655194

Ďalšou alternatívou je pridať fazuľu appProperties znázornenú nižšie:

<bean id="propertyConfigurer"   
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="/WEB-INF/app.properties" />
</bean> 

<bean id="appProperties" 
          class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="singleton" value="true"/>

        <property name="properties">
                <props>
                        <prop key="results.max">${results.max}</prop>
                </props>
        </property>
</bean>

Po načítaní môže byť táto bean obsadená do java.util.Properties, ktorá bude obsahovať vlastnosť s názvom results.max, ktorej hodnota sa načíta z app.properties. Opäť, tento bean môže byť závisle injektovaný (ako inštancia java.util.Properties) do akejkoľvek triedy prostredníctvom anotácie @Resource.

Osobne uprednostňujem toto riešenie (pred druhým, ktoré som navrhol), pretože môžete presne obmedziť, ktoré vlastnosti sú vystavené pomocou appProperties, a nemusíte čítať app.properties dvakrát.

 davek
davek
Edited answer 3 január 2011 в 12:07
15
0
Willi  aus Rohr
Willi aus Rohr
26 november 2008 в 7:19
2008-11-26T07:19:32+00:00
Viac na
Zdroj
Upraviť
#8655195

Potrebujem mať dva súbory vlastností, jeden pre produkciu a jeden pre vývoj (ktorý nebude nasadený).

Ak chcete mať obidva súbory, Properties Bean, ktorý môže byť autowired, a PropertyConfigurer, môžete napísať:

<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="singleton" value="true" />

    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:live.properties</value>
            <value>classpath:development.properties</value>
        </list>
    </property>
</bean>

a odkazovať na Properties Bean v PropertyConfigurer

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="properties" ref="appProperties" />
</bean>
9
0
 D&#243;nal
Dónal
25 november 2008 в 5:22
2008-11-25T17:22:27+00:00
Viac na
Zdroj
Upraviť
#8655193

Možným riešením je deklarovať druhú fazuľu, ktorá bude čítať z rovnakého súboru vlastností:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="/WEB-INF/app.properties" />
</bean>   

<util:properties id="appProperties" location="classpath:/WEB-INF/app.properties"/>

Bean s názvom 'appProperties' je typu java.util.Properties a môže byť závislostne injektovaný pomocou vyššie uvedeného atribútu @Resource.

5
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Zuxriddin Muydinov
Registered pred 11 hodinami
2
Денис Анненский
Registered pred 2 dňami
3
365
Registered pred týždňom
4
True Image
Registered pred týždňom
5
archana agarwal
Registered pred týždňom
DE
EL
ES
FR
ID
IT
JA
KO
NL
PT
RU
SK
TR
ZH
© de-vraag 2022
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora