2016년 11월 16일 수요일

[자바교육,스프링교육(Spring Framework/Boot)추천_탑크리에듀]#18.ref 태그를 이용한 Value Injection(ref local, ref bean, id, name의 차이)

#18.ref 태그를 이용한 Value Injection(ref local, ref bean, id, name의 차이)

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을 더 이상 사용하지 않는다스프링이상이라면 <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이 로드된다.

댓글 없음:

댓글 쓰기