2014-10-21 3 views
0

저는 여러 개의 스프링 구성 자바 클래스가있는 프로젝트에서 작업하고 있습니다. 그들 중 많은 것들은 다른 bean의 생성자에 autowired 된 다음 다른 구성 클래스의 bean을 가지고있다.스프링 3 기본 빈

가능한 한 유연하게 만들기 위해 스프링 프로파일을 사용하여 복수형을 사용할 수있는 경우 사용할 인터페이스 구현을 정의했습니다.

잘 작동하지만 기본 빈을 정의 할 수있는 방법이 있는지 봄 궁금한가요?

예 : classpath에 Foo 유형의 bean이없는 경우 구현 Bar를 주입하십시오. 그렇지 않으면, Bar를 무시하십시오.

나는이 질문을 보았다 : Spring 3: Inject Default Bean Unless Another Bean Present과 모든 콩의 이름을 아는 경우 Java config로 표시된 해결책은 잘 작동하지만 제 경우에는 콩이 무엇인지 알려지지 않을 것입니다.

누구나 달성 할 수있는 방법을 알고 있습니까?

답변

1

기본값을 정의하십시오. 빈의 이름이 동일한 지 확인하십시오. 프로파일 내부의 이름이 기본값보다 우선합니다.

<beans> 

    <!-- The default datasource --> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    </bean> 

    <beans profile="jndi"> 
     <jndi:lookup id="dataSource" jndi-name="jdbc/db" /> 
    </beans> 

</beans> 

이 구성은 Java 기반 구성에서도 작동합니다. 자바 기반 구성을 사용하는 경우

@Configuration 
public DefaultConfig { 

     @Bean 
     public DataSource dataSource() { ... } 

     @Configuration 
     @Profile("jndi") 
     public static class JndiConfig { 

      @Bean 
      public DataSource dataSource() { ... // JNDI lookup } 
     } 

} 

당신은 또한 기본을 지정하고 다른 구성에서 해당 유형의 또 다른 빈을 추가하고 @Primary로 주석을 달 수 있습니다. 인스턴스가 여러 개 발견되면 @Primary이있는 인스턴스를 사용해야합니다.

@Configuration 
public DefaultConfig { 

    @Bean 
    public DataSource dataSource() { ... } 
} 

@Configuration 
@Profile("jndi") 
public class JndiConfig { 

    @Bean 
    @Primary 
    public DataSource jndiDataSource() { ... // JNDI lookup } 
} 
+0

고맙습니다. 제가 원했던 것은 초등학생이었습니다. :) –