봄 @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
'programing' 카테고리의 다른 글
다시 클릭할 때까지 요소 UI 날짜 선택기 구성 요소가 값을 업데이트하지 않는 이유는 무엇입니까? (0) | 2023.07.11 |
---|---|
아님:첫 번째 자식 선택기 (0) | 2023.07.11 |
다음 예제에 포함된 이유는 무엇입니까? (0) | 2023.07.11 |
PostgreSQL을 사용하여 문자열을 정수로 캐스팅하고 캐스트에서 오류가 발생할 경우 0을 가지려면 어떻게 해야 합니까? (0) | 2023.07.11 |
외부 CSS 파일을 참조하지 않고 WordPress PHP 파일에서 인라인 CSS를 만들려면 어떻게 해야 합니까? (0) | 2023.07.11 |