본문 바로가기

SpringFramework Core - I. IoC 컨테이너/9. 어노테이션 기반의 컨테이너 설정

9.3. @Primary를 활용한 어노테이션 기반의 정교한 Autowiring

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-autowired-annotation-primary

 

 

타입으로 autowiring할 때는 여러 후보가 있을 수 있기 때문에, 선택 과정을 좀 더 제어할 필요가 있을 수 있다. 이를 해결하는 방법 중 하나는 스프링의 @Primary 어노테이션이다. @Primary는 단일값인 의존성에 autowired되기 위한 여러 후보들 가운데 특정 bean이 선택을 받을 수 있도록 해준다. 만약 여러 후보 중 정확히 하나의 후보만이 존재한다면 그것이 autowired 값이 된다.

 

다음 설정에서 MovieCatalog의 최우선자로 정의된 firstMovieCatalog를 보자.

@Configuration
public class MovieConfiguration {

    @Bean
    @Primary
    public MovieCatalog firstMovieCatalog() { ... }
    
    @Bean
    public MovieCatalog secondMovieCatalog() { ... }
    
    // ...
}

위 설정에 따라, 다음 MovieRecommender는 firstMovieCatalog와 autowired된다.

public class MovieRecommender {

    @Autowired
    private MovieCatalog movieCatalog;
    
    // ...
}

해당 bean의 정의들은 다음과 같다.

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
        
    <context:annotation-config />
    
    <bean class="example.SimpleMovieCatalog" primary="true">
        <!-- 이 bean이 필요로 하는 의존성들이 주입시킨다 -->
    </bean>
    
    <bean class="example.SimpleMovieCatalog">
        <!-- 이 bean이 필요로 하는 의존성들이 주입시킨다 -->
    </bean>
    
    <bean id="movieRecommender" class="example.MovieRecommender" />
    
</beans>