ref 태그를 이용한 Value Injection(ref local, ref bean, id, name의 차이)
n 하나의 빈을 다른 빈에 주입하기 위해 두 개의 빈 설정이 필요한데 하나의 빈은 주입될 빈이고, 다른 빈은 타겟이 되는 빈에대한 설정이다. 주입될 빈과 타겟에서 setter로 정의한 빈은 서로 호환이 되기만 하면 된다.(타겟에서 정의한 빈이 인터페이스이면 주입될 빈은 인터페이스를 구현한 클래스면 된다.)
n 빈 정의는 같은 XML 파일 내에 있어야 하는데 만약 다른 이름의 빈을 주입하거나 다른 설정파일에서 빈을 찾으려면 <ref> 태그의 bean 속성을 사용해야 한다.
n ref태그를 사용하여 주입하며 ref태그는 항상 property 나 constructor-arg 다음에 나와야 한다.
[app-context4.xml]
<?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-4.2.xsd">
<bean id="onj" name="onjName" class="onj.ref.injection.Onj"/>
<bean id="sample" name="sampleName" class="onj.ref.injection.RefInjectionExam">
<property name="onj">
<ref bean="onj"/> <!-- ref 태그는 빈의 id로 빈을 찾는다. -->
</property>
</bean>
</beans>
[Onj.java]
package onj.ref.injection;
public class Onj {
private String name="OnJ";
private String age = "10";
public String getName() {
return name;
}
public String getAge() {
return age;
}
}
[RefInjectionExam.java]
package onj.ref.injection;
import org.springframework.context.support.GenericXmlApplicationContext;
public class RefInjectionExam {
private Onj onj;
public void setOnj(Onj onj) { this.onj = onj;}
public String toString() {
return "This is ref injection example... " +
"Your name is " + onj.getName() + ", age is " +onj.getAge();
}
public static void main(String[] args) {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.load("classpath:app-context4.xml");
ctx.refresh();
RefInjectionExam sample = (RefInjectionExam) ctx.getBean("sample");
System.out.println(sample);
}
}
n bean vs local
<ref bean=“onjBean”/>
가장 일반적인 형태, 동일한/상위 BeanFactory or ApplicationContext 내에서 자바 빈을 검색, 물론 동일한 XML 설정 파일 내부가 아니더라도 관계 없다. 찾고자 하는 onjBean은 id, name 어느 것이나 정의되어 있으면 된다.
<ref local= “onjBean” />
동일한 XML 설정 파일내에서 onjBean을 검색하며 onjBean은 bean정의의 id, name 어느 것이나 정의되어 있으면 된다. Spring4에서 local을 더 이상 사용하지 않는다. 스프링4 이상이라면 <ref bean=“”/>을 사용하자.
n 빈 정의시 id 와 name의 차이
ü id or bean은 하나의 XML 파일에서는 하나만 정의가능(유일)
ü id는 오로지 하나, name은 여러 개 정의 가능하다.
<bean id="foo" name = "foo1, foo2" class="ojc.Foo"/>
Foo f1 = (Foo) context.getBean("foo");
Foo f2 = (Foo) context.getBean("foo1");
Foo f3 = (Foo) context.getBean("foo2");
ü 다른 설정파일에 name이 같은 빈을 정의할 수 있다. id는 불가.
[bean1.xml]
<bean id="foo" name = "king, queen" class="ojc.Foo"/>
[bean2.xml]
<bean id="bar" name = "king" class="ojc.Bar"/>
FileSystemXmlApplicationContext context =
new FileSystemXmlApplicationContext(new String[] { "beans2.xml", "beans1.xml" });
Foo f = (Foo) context.getBean("king");
bean1.xml 파일이 나중에 로딩되므로 bean1.xml의 king이 로드된다.
댓글 없음:
댓글 쓰기