반응형

Spring Constructor-based Dependency Injection


(원문 위치 : http://www.tutorialspoint.com/spring/constructor_based_dependency_injection.htm )

Example:

[003] HelloWorld Example 을 참조하여 프로젝트를 생성한다.

TextEditor.java file:

package com.tutorialspoint;

public class TextEditor {
   private SpellChecker spellChecker;

   public TextEditor(SpellChecker spellChecker) {
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }
   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}

SpellChecker.java:

package com.tutorialspoint;

public class SpellChecker {
   public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }

   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   }
   
}

MainApp.java file:

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");

      TextEditor te = (TextEditor) context.getBean("textEditor");

      te.spellCheck();
   }
}

Beans.xml:  <constructor-arg>를 이용하여 spellChecker를 삽입하고 있다. 따라서 IoC container가 textEditor, spellChecker bean을 생성하고, <constructor-arg>에 의해 textEditor 생성시 생성자의 인자로 spellChecker를 자동으로 넘겨주게 된다. 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor">
      <constructor-arg ref="spellChecker"/>
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
   </bean>

</beans>

실행 결과는 아래와 같다.

Inside SpellChecker constructor.
Inside TextEditor constructor.
Inside checkSpelling.

Constructor arguments resolution:

생성자에 하나이상의 인자를 갖는다면 모호할 수 있다. 이러한 모허성을 해결하기 위해 bean 정의에 정의되어지는 생성자 인자들의 순서는 적절한 생성자에 제공되어지는 생성자의 순서이다. 아래 class를 보자
package x.y;

public class Foo {
   public Foo(Bar bar, Baz baz) {
      // ...
   }
}
아래 설정은 잘 동작한다.
<beans>
   <bean id="foo" class="x.y.Foo">
      <constructor-arg ref="bar"/>
      <constructor-arg ref="baz"/>
   </bean>

   <bean id="bar" class="x.y.Bar"/>
   <bean id="baz" class="x.y.Baz"/>
</beans>
생성자에 다른 타입이 있는 경우를 보자.
아래 class를 보자.
package x.y;

public class Foo {
   public Foo(int year, String name) {
      // ...
   }
}
type 속성을 사용하여 생성자의 인자의 타입을 명시적으로 사용하면 container는 간단한 type matching을 사용할 수 있다. 예를 들면:
<beans>

   <bean id="exampleBean" class="examples.ExampleBean">
      <constructor-arg type="int" value="2001"/>
      <constructor-arg type="java.lang.String" value="Zara"/>
   </bean>

</beans>
생성자로 인자를 전달하는 최종적이고 가장 좋은 방법은 생성자의 인자에 대한 index를 명시적으로 나타내는 index 속성을 사용하는 것이다. 
<beans>

   <bean id="exampleBean" class="examples.ExampleBean">
      <constructor-arg index="0" value="2001"/>
      <constructor-arg index="1" value="Zara"/>
   </bean>

</beans>
마지막으로, 객체의 참조를 전달하는 경우, <construct-arg> 태그의 ref 속성을 사용해야 하고 값을 직접적으로 전달한다면 위에 보여지는 것과 같이 value속성을 사용해야 한다.


반응형

+ Recent posts