Auto Wire...


스프링은 네 가지 자동 연결 모드를 제공한다. byName, byType, constructor, autodetect가 있다

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="
  5.                 http://www.springframework.org/schema/beans
  6.                 http://www.springframework.org/schema/beans/spring-beans.xsd">

  7. <bean id="foo" class="com.apress.prospring2.ch03.autowiring.Foo" />
  8. <bean id="bar" class="com.apress.prospring2.ch03.autowiring.Bar" />

  9. <bean id="byName" autowire="byName"class="com.apress.prospring2.ch03.autowiring.Target" />
  10. <bean id="byType" autowire="byType"class="com.apress.prospring2.ch03.autowiring.Target" />
  11. <bean id="constructor" autowire="constructor"class="com.apress.prospring2.ch03.autowiring.Target" />
  12. <bean id="autodetect" autowire="autodetect"class="com.apress.prospring2.ch03.autowiring.Target" />

  13. </beans>

 

1) byname연결을 사용하면 스프링은 각 속성과 같은 이름을 가진 빈과 연결을 시도한다. 그러므로 만약 타겟 빈이 foo 라는 속성을 가지고 있고 foo라는 빈이 빈팩토리에 정의되어 있다면 foo 빈은 타겟의 foo 속성에 할당된다.

( 즉 위의 xml처럼 foo,bar가 있고 byName bean이 byName 연결을 사용할경우 Target에 정의된 foo,bar에 할당된다 )

 

2) byType자동 연결을 사용하면 스프링은 빈팩토리에 내부에 타겟 빈의 각 속성의 타입과 같은 타입의 빈으로 연결을 시도한다. 따라서 만약 String 타입 속성을 가진 타겟 빈이 있고 해당 빈팩토리에String 타입 빈이 있다면 스프링은 String 빈을 타겟 빈의 String 타입 속성에 주입할 것이다. 만약 같은 빈팩토리 내부에 같은 타입의 빈이 둘 이상이라면 즉 이 경우에 String 타입 빈이 여러 개면, 스플링은 어떤 것을 자동으로 연결할지 판단할 수 없기 때문에 예외를 발생 시킨다

 

3) constructor연결 모드는 byType 연결과 비슷하지만 주입을 할 때 세터가 아닌 생성자를 사용한다.스프링은 인자 수가 가장 많은 생성자에 대응을 시도한다. 따라서 만약 두 개의 생성자가 있는 데 하나는 String 타입 하나를 받고 다른 하나는 StringInteger를 받고 빈팩토리에 StringInteger 타입의 빈이 스프링은 두 개의 인자를 가지고 있는 생성자를 사용할 것이다.

 

4) autodetect는 스프링이 constructorbyType 모드를 자동으로 선택하게 한다. 만약 빈이 (인자가 없는)기본 생성자를 가지고 있다면 스프링은 byType을 사용하고 그렇지 않으면 constructor 방식을 사용한다

이 글은 스프링노트에서 작성되었습니다.

Posted by 이버리
,