1.4.5 Autowiring Collaborators by ys

auto wiring : spring 빈 설정을 최소한으로 할 수 있도록 하는 기능. 특정 빈을 지정하는 방식이 아닌, spring 프레임워크가 해당 방식에 맞는 spring빈을 자동으로 연결.

wiring : 의존성 주입을 통해 spring bean을 연결하는 것.

Spring 컨테이너는 협력 빈들 사이의 관계를 자동 연결 (autowire) 할 수있습니다. Spring이 ApplicationContext의 내용을 검사함으로써 빈에 대한 협력 bean들을 자동으로 처리하도록 할 수있습다. Autowiring에는 다음과 같은 장점이 있습니다.

  • Autowiring은 프로퍼티나 생성자의 아규먼트를 지정할 필요성을 크게 줄여줍니다. ( 이점에 대해 이 장의 다른 곳에서 논의 된 bean 템플릿과 같은 다른 메커니즘도 역시 중요합니다.)

  • Autowiring은 객체의 발전처럼 설정을 업데이트 할 수 있습니다. 예를 들어 클래스에 의존성을 추가해야하는 경우 설정을 수정할 필요없이 해당 의존성을 자동으로 충족시킬 수 있습니다. 따라서 autowiring은 개발 중에 특히 유용합니다. 코드베이스가 보다 안정적인 상황해서 명시 적 연결하기위해 옵션을 변경 할 필요가 없습니다.

setter Injection 사용 시

Autowire 사용시

XML 기반의 설정 메타 데이터 ( Dependency Injection 참조 )를 사용할 때, <bean/> 의 요소 autowire 속성을 사용하여 Bean 정의에 대한 autowire 모드를 지정할 수있다 . autowiring 기능에는 네 가지 모드가 있습니다. 빈마다 autowiring을 지정하고 따라서 autowire를 선택할 수 있습니다. 다음 표에서는 네 가지 autowiring 모드에 대해 설명합니다.

표 2. 자동 배선 모드

방법

설명

no

(기본값) autowiring 없음. 빈 참조는 ref요소 로 정의해야합니다 . 협력 bean들을 를 명시 적으로 지정하면 제어력과 명확성이 높아지기 때문에 대규모 배포에서는 기본 설정을 변경하지 않는 것이 좋습니다. 어느 정도까지는 시스템의 구조를 문서화합니다.

byName

속성 이름에 의한 자동 연결. Spring은 autowired 할 필요가있는 프로퍼티와 같은 이름의 bean을 찾는다. 예를 들어 bean 정의가 이름으로 autowire로 설정되고 master 프로퍼티가 포함되어 있으면 (즉, setMaster(..)메소드 가있는 경우 ) Spring은 master 로 명명 된 bean 정의를 찾고 프로퍼티를 설정하는 데 사용합니다.

byType

컨테이너 내에서 프로퍼티 타입과 정확히 일치하는 하나의 빈이있다면 프로퍼티를 자동연결합니다. 하나보다 많은 빈 존재하면 해당 빈에대해서는 byType 자동 연결을 사용하지 말아야 한다는 것을 말해주는 fatal 예외가 던져집니다. 일치하는 빈이 하나도 없다면 아무일도 일어나지 않습니다. ( 프로퍼티도 정의 되지 않습니다.)

Constructor

byType과 유사하지만 생성자 아규먼트에 적용됩니다. 컨테이너에 생성자 아규먼트 타입과 정확히 일치하는 빈이 하나도 없으면 fatal 오류가 발생합니다.

byType또는 constructor를 autowiring 모드와 를 사용해서 당신은 배열 및 타입이 있는 컬렉션을 연결할 수 있습니다. 이 경우 컨테이너 내에 타입이 일치할 것으로 기대되는 모든 autowire 후보가 의존성을 충족시키기 위해 제공됩니다. 예상되는 키 유형이 String이면 강력한 유형의 Map 과 자동연결할 수 있습니다. 자동연결된 Map 의 인스턴스의 값들은 예상되는 유형과 일치하는 모든 bean 인스턴스로 구성될 것이고 Map인스턴스의 키에는 해당 bean 들의 이름이 포함됩니다.

자동 연결의 한계와 단점

자동 연결은 프로젝트 전체에서 일관되게 사용될 때 가장 최상으로 작동합니다. autowiring이 일반적으로 사용되지 않는다면 한 두개의 빈 정의만을 연결하려고 자동연결을 사용하는 개발자에게 혼동을 줄 것입니다.

autowiring의 한계와 단점을 고려하십시오.

  • propertyconstructor-arg설정의 명시적인 의존성은 항상 autowiring보다 우선합니다. 프리미티브타입, Strings, Classes 같은 간단한 프로퍼티들 (이러한 간단한 프로퍼티의 배열포함)은 autowire 수 없습니다 . 이 제한은 디자인에 의한 것입니다.

  • 자동 연결은 명시 적 연결보다 정확하지 않습니다. 이전 표에서 언급했듯이, Spring은 예기치 않은 결과를 초래할 수도있는 애매한 경우에 추측을 피하기 위해 주의를 기울였지만 Spring 관리하는 객체 간의 관계는 더 이상 명백하게문서화되지 않습니다.

  • Spring 컨테이너에서 문서를 생성하는 것 같은 도구에서는 연결 정보를 사용할 수 없습니다.

  • 컨테이너 내의 여러 bean 정의는 autowired 될 setter 메소드 또는 생성자 아규먼트로 지정된 유형과 일치 할 수 있습니다. 배열, 컬렉션 또는 Map인스턴스의 경우 반드시 문제는 아닙니다. 그러나 단일 값을 예상하는 의존성의 경우 이 모호성은 임의로 해결되지 않습니다. 유일한 Bean 정의가 없으면 예외가 발생합니다.

후자의 시나리오에는 몇 가지 옵션이 있습니다.

  • 명백한 연결을 위해 자동 연결을 포기합니다.

  • 다음 섹션 에서 설명할 autowire-candidate 속성에 false를 를 설정해서 빈 정의의 자동연결을 피합니다.

  • <bean/>요소의 primary속성을 true로 설정하여 단일 bean 정의를 기본 후보로 지정하십시오 .

  • Annotation 기반 컨테이너 구성에 설명 된 것처럼 annotation 기반 설정으로 보다 세부적인 컨트롤을 구현하십시오 .

자동 연결에서 Bean 제외

per-bean원리에 따라 자동 연결에서 Bean을 제외 할 수 있습니다. Spring의 XML 포맷에서, <bean/> 요소 autowire-candidate설정을 false로 설정한다 . 컨테이너는 autowiring 기반 구조 (예 :@Autowired와 같은 어노테이션 스타일 설정 포함)에서 특정 bean 정의를 사용할 수 없도록 만듭니다 .

autowire-candidate속성은 오직 타입 기반 자동 연결에만 영향을 주도록 설계되었습니다. 지정된 bean이 autowire 후보로 표시되지 않아도 해결되는 이름 별 명시 적 참조에는 영향을주지 않습니다. 결과적으로, 이름에 따른 autowiring은 이름이 일치한다면 bean을 주입합니다.

또한 bean 이름에 대한 패턴 일치를 기반으로 autowire 후보를 제한 할 수 있습니다. 최상위 레벨 <beans/>요소는 default-autowire-candidates속성으 하나 이상의 패턴을 갖습니다. 예를 들어, Repository로 끝나는 이름을 가진 빈을 자동연결 후보에서 제외하려면 *Repository값을 제공하십시오 . 여러 패턴을 제공하려면 쉼표로 구분 된 목록으로 정의하십시오. 빈 정의의에 대한 autowire-candidate속성은 true또는 false명시적으로 지정하면 항상 우선시 됩니다. 이러한 bean의 경우 패턴 일치 규칙이 적용되지 않습니다.

이 기술들은 autowiring로 다른 bean에 삽입하고 싶지 않은 bean에 유용합니다. 이는 제외된 빈이 스스로 autowiring을 사용하여 설정할 수 없다는 것을 의미하지는 않습니다. 더 적절히 말하면 bean 자신은 다른 bean을 autowiring하기위한 후보가 아닙니다.

Last updated