Fine-tuning Annotation-based Autowiring with @Primary

2023. 7. 8. 19:06Spring Framework/Spring IoC

Fine-tuning Annotation-based Autowiring with @Primary

자동 주입 시 타입에 의해 여러 후보가 생길 수 있기 때문에, 종종 선택 과정을 더 잘 제어할 필요가 있습니다. 이를 해결하는 한 가지 방법은 Spring의 @Primary 어노테이션을 사용하는 것입니다. @Primary는 특정 빈이 자동 주입을 위한 단일 값 의존성에 여러 후보가 있을 때 우선적으로 선택되도록 지정합니다. 후보 중에 정확히 하나의 @Primary 빈이 존재하면, 해당 빈이 자동 주입됩니다.

다음은 firstMovieCatalogMovieCatalog의 기본 빈으로 정의한 구성 예시입니다:

Java

@Configuration
public class MovieConfiguration {

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

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

    // ...
}

위의 구성에 따라, 아래의 MovieRecommender 클래스는 firstMovieCatalog 빈으로 자동 주입됩니다:

Java

public class MovieRecommender {

    @Autowired
    private MovieCatalog movieCatalog;

    // ...
}

다음은 이에 해당하는 빈 정의입니다:

<?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 class="example.SimpleMovieCatalog">
        <!-- 이 빈에 필요한 의존성을 주입 -->
    </bean>

    <bean id="movieRecommender" class="example.MovieRecommender"/>

</beans>