2011-06-21 12 views
12

Próbuję załadować plik właściwości do komponentu Spring bean, a następnie wstrzyknąć ten komponent bean do klasy.Właściwości wstrzykiwania za pomocą sprężyny i adnotacji @ Wartość

Jedyną częścią nie mogę dostać się do pracy wydaje się być pomocą @Resource reference.Can ktoś połączyć ostatni kawałek dla mnie? Za każdym razem otrzymuję wartość zerową. Wygląda na to, że nie chce wstrzykiwać wartości.

[EDIT] - Pierwotnie sądziłem, że używanie @Resource było najlepszym sposobem, ale proponowane rozwiązanie znalazłem łatwiej.

Widziałem to rozwiązanie w innym poście:

referencyjny Rozwiązanie Link:Inject Property Value into Spring - posted by DON

kredytową do Don na stanowisko, ale po prostu nie był pewien, jak skończyć z @Resource .

debugowania Wyniki: wartość zmiennej appProperties zawsze ma wartość null. To nie jest wstrzykiwane.

Konfig. Wiosny. enter image description here

Próbka Klasa:

package test; 

import java.util.Properties; 
import javax.annotation.Resource; 


public class foo { 
    public foo() {} 
    @Resource private java.util.Properties appProperties; 
} 

oparciu o poradę w zatwierdzonym roztworze poniżej. Oto zmiany, które wprowadziłem.


Rozwiązanie Aktualizacja:

Wiosna Config: enter image description here

Java Class: enter image description here

+0

Co się dzieje, kiedy spróbować rozwiązanie? – skaffman

+0

prywatne @Resource Properties to literówka? czy próbowałeś @Resource prywatnych właściwości? Nie jestem pewien, czy to nie powinno działać w ten sposób Po prostu nigdy nie widziałem adnotacji nie przed modyfikatorem. – abalogh

+0

@Skaffman - Otrzymuję wartość pustą. Wartość zmiennej nie jest wiązana i wstrzykiwana. – haju

Odpowiedz

17

Na rozwiązanie do pracy będzie trzeba także zrobić foo Wiosny zarządzanego fasoli; ponieważ inaczej skąd Spring wiedziałaby, że ma do czynienia z którąś z twoich adnotacji na twojej klasie?

  • Można też określić go w appcontext XML jako fasoli z ..class="foo"
  • Albo użyć component-scan i określić pakiet podstawowy, który zawiera swoją klasę foo.

Ponieważ nie jestem całkowicie pewien, że to jest dokładnie to, co chcesz (nie chcesz do .Properties plik zostać przeanalizowane przez wiosnę i mieć to pary klucz-wartość dostępnych zamiast Properties obiektu?), Ja sugeruję Ci inne rozwiązanie: Korzystanie z util nazw

<util:properties id="props" location="classpath:com/foo/bar/props.properties"/> 

i odniesienie do wartości wewnątrz firmy fasoli (również muszą być Wiosna udało):

@Value("#{props.foo}") 
public void setFoo(String foo) { 
    this.foo = foo; 
} 

EDIT:

właśnie zdałem sobie sprawę, że importujesz w swojej klasie org.springframework.context.ApplicationContext, co prawdopodobnie nie jest konieczne. Gorąco zachęcam do przeczytania Spring reference co najmniej pierwszych kilku rozdziałów, ponieważ a) jest to świetna lektura b) będzie ci łatwiej zrozumieć Spring, jeśli podstawy są jasne.

+0

Dzięki abalough Spróbuję tego z tagiem haju

+0

Jeśli wybiorę pierwszą metodę implementacji, nie używając komponentu @Component ze skanowaniem składników, nie będę już używać wartości @Value, ponieważ będę musiał wstrzyknąć konfigurację wiosną? – haju

+0

Należy również zauważyć, że wartość, którą podasz w @Value, "# {props.foo}" w powyższym przykładzie, nie powinna zawierać kropek dla samego klucza KEY ("foo" w tym przykładzie). Migrowałem, aby używać EL ze starej szkoły, gdzie moje klucze w pliku własności miały postać a.b.c = xyz itd. I nie udało się. Natomiast powiedzmy abc = xyz pracował. – arcseldon

3

Jeszcze jedno rozwiązanie z użyciem symbolu zastępczego właściwości.

Kontekst wiosna:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <context:component-scan base-package="your.packege" /> 

    <context:property-placeholder location="classpath*:*.properties"/> 

</beans> 

klasy Javy gdzie chcesz wstrzyknąć właściwości wartości:

public class ClassWithInjectedProperty { 

    @Value("${props.foo}") 
    private String foo; 
} 
Powiązane problemy