반응형
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속성을 사용해야 한다.
반응형