복붙노트

[SPRING] JavaConfig의 Spring Bean 별칭

SPRING

JavaConfig의 Spring Bean 별칭

모든 프로젝트에서 사용할 수있는 핵심 기능을 제공하는 @Service 주석 클래스가 있습니다.

@Service
public class MyService {}

프로젝트 특정 항목을 구현하기 위해 그것을 확장하는 다른 하나 :

@Service
public class ExtendedMyService extends MyService {}

이제 속성을 사용하여 autowiring 할 때 @Qualifier ( "MyServiceAlias")를 사용할 수 있도록 bean 별칭을 구성하려고합니다.

# MyService qualifier (default: myService)
myService.qualifier=extendedMyService

XML에서는 다음과 같이 보입니다.

<alias name="${myService.qualifier}" alias="MyServiceAlias" />

여기에서도 설명하지만 XML, JavaConfig 만 사용하면됩니다. 가능하고 깨달을 수 있습니까?

해결법

  1. ==============================

    1.Jira가 열려 있습니다 : https://jira.spring.io/browse/SPR-6736

    Jira가 열려 있습니다 : https://jira.spring.io/browse/SPR-6736

    해결 방법은 @Configuration 클래스에서 @Bean을 사용하는 것입니다.

    @Configuration
    public class AppConfig {
    
      @Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })
      public MyService myService() {}
    
    }
    
  2. ==============================

    2.자리 표시자를 사용하려면 @Value와 Spring applicationContext를 사용하여 @Configuration 클래스에서 @Bean을 사용하는 다른 해결 방법이 있습니다.

    자리 표시자를 사용하려면 @Value와 Spring applicationContext를 사용하여 @Configuration 클래스에서 @Bean을 사용하는 다른 해결 방법이 있습니다.

    @Configuration
    public class AppConfig {
    
        @Autowired
        private ApplicationContext context;
    
        @Bean
        public MyService myService(@Value("${myService.qualifier}") String qualifier) {
            return (MyService) context.getBean(qualifier);
        }
    }
    

    주의 : 처음에로드되어야하는 플레이스 홀더 빈에 대해서는 특별한 고려가 필요하다 (cf javadoc)

  3. ==============================

    3.소량의 구성 및 하나의 ImportBeanDefinitionRegistrar를 사용하여 Java 구성을 통해 Bean 별명을 구성 할 수 있습니다. Bean-Alias ​​라이브러리 프로젝트를 참조하여 프로젝트의 필요에 맞게 확인할 수 있습니다. 사용 된 스프링 버전이 설치 프로그램에서 작동하지 않는 경우에 대비하여 소스를 자신의 프로젝트로 수정하거나 복사하십시오.

    소량의 구성 및 하나의 ImportBeanDefinitionRegistrar를 사용하여 Java 구성을 통해 Bean 별명을 구성 할 수 있습니다. Bean-Alias ​​라이브러리 프로젝트를 참조하여 프로젝트의 필요에 맞게 확인할 수 있습니다. 사용 된 스프링 버전이 설치 프로그램에서 작동하지 않는 경우에 대비하여 소스를 자신의 프로젝트로 수정하거나 복사하십시오.

    경로에 라이브러리가 있으면 주석을 통해 별칭을 선언합니다.

    @Configuration
    @BeanAlias(name = "fromName", alias = "toName")
    public class ExampleConfiguration {
    }
    

    그게 전부 야.

    그것이 작동하는 방법은 주석을 사용하여 ImportBeanDefinitionRegistrar 구현을 가져 오는 것입니다.

    @Import(BeanAliasBeanRegistrar.class)
    public @interface BeanAlias {
    }
    

    BeanDefinitionRegistry에 별명을 등록합니다.

    class BeanAliasBeanRegistrar implements ImportBeanDefinitionRegistrar, PriorityOrdered {
    
        @Override
        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
          ...
          registerAlias(registry, metadata.getAnnotationAttributes(BeanAlias.class.getName()));
        }
    
        private void registerAlias(BeanDefinitionRegistry registry, Map<String, Object> attributes) {
          ...
          registry.registerAlias(name, alias);
        }
    }
    
  4. from https://stackoverflow.com/questions/27107133/spring-bean-alias-in-javaconfig by cc-by-sa and MIT license