3.3.1. Injecting dependencies

DI(Dependency Injection)이 적용되면 클래스들간의 관계에 고도의 디커플링을 유지할 수 있고 코드가 훨씬 깨끗해 집니다. 주로 setter injection과 constructor injection으로 나뉩니다.

Service Locater 패턴
참조.
Setter Injection & Constructor Injection

3.3.2. Constructor Argument Resolution

생성자의 인자를 구분 할 필요가 있는 경우에 인자의 type 또는 index로 구분할 수 있습니다.

Constructor Injection 할 때 인자 구분

3.3.3. Bean properties and constructor arguments detailed

<property /> 태그(=엘리먼트)와 <constructor-arg /> 태그는 종속성을 가지는 대상에 따라 사용할 수 있는 하위 태그들이 여러개 있습니다. ex. <value /> <idref /> <ref /> <bean />[footnote]inner bean[/footnote] <list /> <set /> <map /> <props /> <null />

idref 엘리먼트
Inner beans
Collections - <list />
Collection Merging

3.3.4. Using depends-on

<bean /> 태그의 depends-on 속성에 bean의 id를 적어주면 현재 bean을 초기화하기 전에 depends-on 속성에 적어준 bean들을 먼저 초기화 합니다.

<bean id="beanOne" class="ExampleBean" depends-on="manager"/>

<bean id="manager" class="ManagerBean" />

위와 같이 설정 한다면 beanOne을 초기화 하기 전에 manager bean을 먼저 초기화 합니다.

만약 여러개의 bean에 종속성을 가지고 그 bean들이 먼저 초기화 되길 바란다면 아래 처럼 여러개를 적을 수 있습니다.

<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
  <property name="manager" ref="manager" />
</bean>

<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />


3.3.5. Lazily-instantiating beans

ApplicationContext를 구현한 container들은 모든 bean들을 기본적으로 singleton scope의 bean들을 pre-instantiation(초기 생성?) 합니다. [footnote]pre-instantiation은 container의 초기화 과정에서 객체를 생성하고 종속성을 설정하게 되는 것을 말합니다.[/footnote] 그렇게 함으로써 초기에 설정이나 기타 환경에 대한 에러들을 초기에 발견할 수 있습니다.

하지만~ 초기에 모든 bean들을 만들어 내기 싫을 수가 있는데요. 그럴 때는 <bean /> 태그에 lazy-init="true" 를 추가하여 하나의 bean이 초기화 지연 기법을 사용할 수 있으며...
container의 기본 설정을 바꾸려면 configuration metadata의 최상위 엘리먼트인 <beans /> 태그에 default-lazy-init="true" 를 추가하면 됩니다.

주의 : pre-instantiation bean이 lazy bean에 종속성을 가진다면..먼저 만들어야 할 bean 때문에 나중에 만들 bean도 먼저 만들게 됩니다.

3.3.6. Autowiring collaborators

bean들 간의 종속성을 자동으로 맺어 줄 수 있는 기능이 있습니다. 장단점을 알아봐야겠습니다.

Autowiring

3.3.7. Checking for dependencies

bean에 있는 모든 property들이 잘 세팅이 되었는지 확인하고 싶을 때 사용할 수 있습니다. <bean /> 태그에 dependency-check 속성에 네가지 모드 값 중에 하나를 선택에서 넣어주면 됩니다.

Mode Explanation
none

No dependency checking. Properties of the bean which
have no value specified for them are simply not set.

simple

Dependency checking is performed for primitive types
and collections (everything except collaborators, i.e. other
beans)

object

Dependency checking is performed for collaborators only

all

Dependency checking is done for collaborators, primitive types
and collections


3.3.8. Method Injection

singlton bean(매번 같은 객체) A가 non-singleton bean(매번 다른 객체) B를 사용하게 된다면(종속성을 가지면)...B는 의도 했던 바와는 다르게.. 매번 같은 객체만 사용될 것입니다.
 
이 문제를 해결 하는 방법으로는.. A가 BeanFactoryAware 인터페이스를 구현해서 B를 요구할 때마다 getBean("B")를 이용하는 방법이 있긴 한데...

이러면 A라는 클래스가 BeanFactoryAware라는 Spring Framework의 코드에 종속되기 때문에 Method Injection이라는 것을 사용해서 좀 더 깔끔하게 이 문제를 해결 할 수 있다고 합니다.