programing

봄 @Bean(이름 ="이름") vs @Bean @Qualifier("이름")

skycolor 2023. 7. 11. 21:57
반응형

봄 @Bean(이름 ="이름") vs @Bean @Qualifier("이름")

아래 2개의 콩 선언과 다른 점이 있습니까?

 @Bean(name = "bean1")
 public A getA() {
     return new A();
 }


 @Bean
 @Qualifier("bean1")
 public A getA() {
     return new A();
 }

다음을 사용하여 둘 다 자동 배선할 수 있습니다.@Qualifier

 @Autowire
 public void test(@Qualifier("bean1") A a) {
     ...
 }

와 함께value()속성 이름을 지정할 필요가 없습니다.@Qualifier("bean1").기여하다name()와 동일한 값을 참조합니다.value()사용자 지정 주석 때문에@AliasFor(..)봄부터, 그러므로 그들은 같은 행동을 가진 단지 다른 이름일 뿐입니다.

사용할 수 있습니다.

 @Autowire
 public void test(A bean1) {
     ...
 }

을 이용하면

 @Bean(name = "bean1")

와는 다른

@Bean
@Qualifier("bean1")

동일한 한정자 이름을 가진 여러 개의 콩을 가질 수 있지만 봄 응용 프로그램 컨텍스트의 콩 이름은 고유해야 합니다.

    @Bean
    @Qualifier("qualifier1")
    Foo foo()
    {
        return new Foo();
    }

    @Bean
    @Qualifier("qualifier1")
    Bar bar()
    {
        return new Bar();
    }

위의 코드는 허용 가능합니다.하지만 콩의 경우에는 그렇지 않습니다.

첫 번째 부분은 기본적으로 같고, 두 번째 부분은 같은 종류의 콩이 두 개 이상 존재할 때 기본적으로 필요한 것입니다.첫 번째 부분은 사람들이 가질 수 있는 선호도입니다.

@Qualifier("beanName")콩 이름의 고유성을 보장하지 않습니다.예:

class SomeBean{
  // class of some bean;
}

@Configuration
class BeanConfig{

  @Bean (name = "beanConfig") // will cause run error, as spring-boot already automatically creates a bean named "beanConfig" due to the @Configuration annotation;
  @Qualifier("beanConfig") // can run without error;
  SomeBean createBean(){
    // return a bean of class SomeBean;
  }
}

따라서, 사용:@Bean(name = "beanConfig")중복된 빈 이름을 피하는 것이 좋습니다. 실행 오류는 다음과 같은 사항을 확인하는 데 도움이 됩니다."하, 그 콩은 다음과 같이 이름 지어져야 합니다.someBean것은 아니다.beanConfig".

예, 차이점이 있습니다.@Bean("foo")(또는)@Component("foo")) Spring Context에서 당신의 콩에 "foo"라는 이름을 주는 반면,@Qualifier("foo")콩의 이름을 변경하지 않고 정보만 추가합니다.

콩 이름은 컨텍스트에서 콩의 고유 식별자이므로 "foo"라는 이름의 콩을 하나만 가질 수 있는 반면, 여러 개의 콩을 가질 수 있습니다.@Qualifier("foo").

예:

interface TypeOne {}

다음은 클래스 이름에서 자동으로 생성되는 "beanOne" 이름의 빈을 추가합니다.

@Component // explicitly: @Component("beanOne")
class BeanOne implements TypeOne {
}

a 내에서 다음 선언과 같습니다.@Configuration클래스:

@Bean // explicitly: @Bean(name = "beanOne")
BeanOne beanOne() { return new BeanOne(); }

다음은 "beanTwo"라는 이름의 콩과 "bean"이라는 이름의 콩을 추가합니다.3", 동일한 한정자 "bean Qualifier":

@Component
@Qualifier("beanQualifier")
class BeanTwo implements TypeOne { }

@Component
@Qualifier("beanQualifier")
class BeanThree implements TypeOne { }

위에서 한정자를 사용하여 자동 배선할 수 있습니다.

@Autowired
@Qualifier("beanQualifier")
Map<String, TypeOne> typeOneMap;

맵에는 한정자 "bean Qualifier"가 있는 두 개의 콩만 포함됩니다.

{beanThree=BeanThree@9f674ac, beanTwo=BeanTwo@1da4b3f9}

다른 하나인 "beanOne"은 "beanQualifier"의 자격이 없기 때문에 지도에 연결되지 않았습니다.

맵 키는 자동으로 생성된 빈 이름입니다.

언급URL : https://stackoverflow.com/questions/62822167/spring-beanname-name-vs-bean-qualifiername

반응형