Loading...
Spring Framework Reference Documentation 7.0.2의 Autowiring Collaborators의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Spring 컨테이너는 협력하는 빈들 사이의 관계를 autowire할 수 있습니다. 당신의 빈에 대해 ApplicationContext의 내용을 검사함으로써 Spring이 collaborator(다른 빈)들을 자동으로 resolve하도록 할 수 있습니다. Autowiring에는 다음과 같은 장점이 있습니다:
Autowiring은 프로퍼티나 생성자 인자를 명시해야 하는 필요성을 크게 줄일 수 있습니다. (빈 템플릿과 같은 다른 메커니즘도 이 장의 다른 곳에서 논의되며 이 점에서 또한 유용합니다.)
Autowiring은 객체가 발전함에 따라 설정을 업데이트할 수 있습니다. 예를 들어, 클래스에 의존성을 추가해야 하는 경우, 그 의존성은 설정을 수정할 필요 없이 자동으로 충족될 수 있습니다. 따라서 autowiring은 코드 베이스가 더 안정적이 되었을 때 명시적인 wiring으로 전환할 수 있는 옵션을 부정하지 않으면서 개발 중에 특히 유용할 수 있습니다.
XML 기반 설정 메타데이터를 사용할 때(see
Dependency Injection),
<bean/> element의 autowire attribute로 빈 정의에 대한 autowire 모드를 지정할 수 있습니다. Autowiring 기능에는 네 가지 모드가 있습니다. 빈마다 autowiring을 지정할 수 있으므로 어떤 빈을 autowire할지 선택할 수 있습니다.
다음 표는 네 가지 autowiring 모드를 설명합니다:
| Mode | Explanation |
|---|---|
no | (Default) Autowiring 없음. 빈 참조는 ref element로 정의되어야 합니다. 더 큰 배포의 경우,<br>collaborator를 명시적으로 지정하는 것이 더 큰 제어와 명확성을 제공하므로 기본 설정을 변경하는 것은<br>권장되지 않습니다. 어느 정도까지는, 이것이 시스템의 구조를 문서화합니다. |
byName | 프로퍼티 이름에 의한 autowiring. Spring은 autowire가 필요한 프로퍼티와 동일한 이름을 가진 빈을 찾습니다.<br>예를 들어, 빈 정의가 이름에 의해 autowire되도록 설정되어 있고 master 프로퍼티를 포함하는 경우<br>(즉, setMaster(..) 메서드가 있는 경우), Spring은 master라는 이름의 빈 정의를 찾아 해당 프로퍼티를<br>설정하는 데 사용합니다. |
byType | 컨테이너에 프로퍼티 타입의 빈이 정확히 하나 존재하는 경우 프로퍼티가 autowire되도록 허용합니다.<br>둘 이상 존재하면 치명적인 예외가 발생하며, 이는 해당 빈에 대해 byType autowiring을 사용할 수 없음을<br>나타냅니다. 일치하는 빈이 없으면 아무 일도 일어나지 않습니다(프로퍼티는 설정되지 않습니다). |
constructor | byType와 유사하지만 생성자 인자에 적용됩니다. 컨테이너에 생성자 인자 타입의 빈이<br>정확히 하나 존재하지 않으면 치명적인 오류가 발생합니다. |
Table 1. Autowiring modes
byType 또는 constructor autowiring 모드를 사용하면 배열과 타입이 지정된 컬렉션을 wire할 수 있습니다. 이러한 경우, 예상 타입과 일치하는 컨테이너 내의 모든 autowire candidate가 의존성을 충족하기 위해 제공됩니다. 예상 key 타입이 String인 경우 strong 타입의 Map 인스턴스를 autowire할 수 있습니다.
Autowired Map 인스턴스의 value는 예상 타입과 일치하는 모든 빈 인스턴스로 구성되며, Map 인스턴스의 key는 해당 빈 이름을 포함합니다.
Autowiring은 프로젝트 전체에서 일관되게 사용될 때 가장 잘 작동합니다. 일반적으로 autowiring이 사용되지 않는다면, 한두 개의 빈 정의에 대해서만 이를 사용하여 wire하는 것은 개발자에게 혼란을 줄 수 있습니다.
Autowiring의 limitation과 disadvantage를 고려하십시오:
property 및 constructor-arg 설정의 명시적인 의존성은 항상 autowiring보다 우선합니다.
Primitive, String, Class(및 이러한 simple 프로퍼티의 배열)와 같은 simple 프로퍼티는 autowire할 수 없습니다. 이 limitation은 설계에 따른 것입니다.Map 인스턴스의 경우, 이것은 반드시 문제가 되지는 않습니다. 그러나 단일 값을 기대하는 의존성의 경우, 이 모호성은 임의로 해결되지 않습니다. 고유한 빈 정의를 사용할 수 없는 경우 예외가 발생합니다.후자의 시나리오에서는 여러 가지 option이 있습니다:
autowire-candidate attribute를 false로 설정하여 빈 정의에 대해 autowiring을 피합니다.
next section.<bean/> element의 primary attribute를 true로 설정하여 단일 빈 정의를 primary candidate로 지정합니다.빈 단위로, 빈을 autowiring에서 제외할 수 있습니다. Spring의 XML 포맷에서는 <bean/> element의 autowire-candidate attribute를 false로 설정합니다. @Bean annotation에서는 attribute 이름이 autowireCandidate입니다.
컨테이너는 해당 빈 정의를 annotation 기반 injection point(예: @Autowired)를 포함한 autowiring 인프라스트럭처에서 사용할 수 없게 만듭니다.
autowire-candidateattribute는 타입 기반 autowiring에만 영향을 주도록 설계되었습니다.<br>Autowire candidate로 표시되지 않은 빈이라도 이름에 의한 명시적인 reference는 여전히 resolve되므로<br>이에 영향을 주지 않습니다. 결과적으로, 이름에 의한 autowiring은 이름이 일치하는 경우 여전히 빈을<br>inject합니다.
빈 이름에 대한 pattern-matching을 기반으로 autowire candidate를 제한할 수도 있습니다. 최상위 <beans/> element는 default-autowire-candidates attribute 내에서 하나 이상의 pattern을 허용합니다. 예를 들어, 이름이 Repository로 끝나는 빈에 대해서만 autowire candidate status를 제한하려면 *Repository 값을 제공합니다.
여러 pattern을 제공하려면 comma로 구분된 목록으로 정의합니다. 빈 정의의 autowire-candidate attribute에 대한 명시적인 true 또는 false 값은 항상 우선합니다. 이러한 빈에 대해서는 pattern matching rule이 적용되지 않습니다.
이러한 technique은 autowiring에 의해 다른 빈에 절대 inject되기를 원하지 않는 빈에 유용합니다. 이는 제외된 빈이 autowiring을 사용하여 자체적으로 설정될 수 없다는 의미는 아닙니다. 오히려, 해당 빈 자체가 다른 빈을 autowire하기 위한 candidate가 아닙니다.
6.2부터,
@Bean메서드는 autowire candidate flag의 두 가지 variant를 지원합니다:<br>autowireCandidate와defaultCandidate입니다.<br>Qualifier를 사용할 때,<br>defaultCandidate=false로 표시된 빈은 추가 qualifier indication이 존재하는 injection point에만 사용 가능합니다.<br>이는 특정 영역에서는 inject 가능하지만 다른 곳에서 동일 타입의 빈을 방해해서는 안 되는 제한된 delegate에<br>유용합니다. 이러한 빈은 선언된 타입만으로는 절대 inject되지 않으며, 타입에 특정 qualifier가 더해진<br>경우에만 inject됩니다.<br>반대로,autowireCandidate=false는 위에서 설명한 대로autowire-candidateattribute와 정확히 동일하게<br>동작합니다. 이러한 빈은 타입에 의해 전혀 inject되지 않습니다.
Lazy-initialized Beans
Method Injection