2013-12-21 2 views
0

아래의 구성 설정을 사용하고 있습니다. @configuration 클래스는 프로퍼티 파일을로드하고 barUserList 및 fooUserList에 의존하는 클래스가 쉽게 소비 할 수있는 방식으로 프로퍼티 파일의 관련 청크를 추출하는 arraylist를 생성합니다. 그들은 속성 파일에서 온 것인지도 모릅니다. DI를 위해 Huzzah!스프링 3+에서 XML없이 @Qualifier를 설정하는 방법

나는 봄에 내가 원하는 것을 말하려고 할 때 내 문제가 생긴다. Foo 클래스는 fooUserList를 원하므로 @Qualifier 주석을 사용할 수 있어야하지만 XML 외부에서/set/한정자를 찾을 수는 없습니다.

제 질문은 이것입니다. Javaland에서이 두 개의 Spring 빈에 대한 한정자를 어떻게 설정합니까? 제로 XML 설정은 나를 위해 큰 목표입니다. 나는 당신이 @name을 설정할 수 있고 @qualifier 메커니즘이 @name으로 기본 될 것이라는 것을 알고 있지만, 나는 이것을 사용하지 않을 것이다. 나는 다른 것들을 "기본"으로하는 것을 좋아하지 않습니다.

다음과 같이 나는 @Qualifier@Bean의 이름을 정의하고 그것을 사용하여 할 수있는 봄 3.2.5.RELEASE에게

@Configuration 
public class AppConfig { 

    @Bean 
    Properties loadProperties() throws IOException { 
     Properties properties = new Properties(); 
     properties.load(new FileInputStream("checker.properties")); 
     return properties; 
    } 

    @Bean 
    @Autowired 
    ArrayList<String> barUserList(Properties properties) { 
     ArrayList<String> barUsernames = new ArrayList<String>(); 
Collections.addAll(barUsernames, properties.getProperty("site.bar.watchedUsernames", "").split(",")); 
     return barUsernames; 
    } 

    @Bean 
    @Autowired 
    ArrayList<String> fooUserList(Properties properties) { 
     ArrayList<String> fooUsernames = new ArrayList<String>(); 
     Collections.addAll(fooUsernames, properties.getProperty("site.foo.watchedUsernames", "").split(",")); 
     return fooUsernames; 
    } 
} 

답변

2

한 가지 방법을 사용하고 있습니다 :

@Bean(name="barUserList") 
@Autowired 
ArrayList<String> barUserList(Properties properties) { 
    ArrayList<String> barUsernames = new ArrayList<String>(); 
    Collections.addAll(barUsernames, properties.getProperty("site.bar.watchedUsernames", "").split(",")); 
    return barUsernames; 
} 

와 내를 당신은 다음과 같은 것을 사용할 수 있습니다 :

// ... 
@Autowired 
@Qualifier("barUserList") 
private List<String> userList; 
// ... 
+0

이름은 모두 무엇에 익숙합니까? 나는 다른 무엇보다도 "쾅쾅"할 것인가? 아니면 실제로 내 용도로 사용되지 않는 이름입니까? 이름을 기반으로 한 Autowiring을 할 계획이 아닙니다. – Jazzepi

+0

이 경우 이름은'List'의 어느 인스턴스가 사용되는지 정의하는데 사용됩니다. 여러분의 경우에는 이름이 주어지지 않을 때 메소드의 이름이 사용되기 때문에'@ Bean'에서 이름을 빼낼 수 있습니다. 나는 리팩토링에서 꽤 복잡해지기 때문에 문자열을 사용하는 것을 좋아하지 않는다. 일반적으로 한정자 주석을 정의하고 그것을'@Buan' 생성을'@ Autowired' 바인딩에 바인딩하는 데 사용한다. [here] (http://docs.spring.io/spring/docs/3.0.x/reference/beans.html#beans-autowired-annotation-qualifiers)에 대한 자세한 내용은 예제에서 '@ Offline'이라는 주석을 정의하십시오. . –

+0

확인해 보겠습니다. 감사. – Jazzepi

관련 문제