#14.스프링DI(메소드 주입,메소드 대체,게터주입)
메소드 주입(Method Injection)
<!--[if !supportLists]-->n
<!--[endif]-->Method 정의 전체에 Bean을 주입하는 것으로 Method Replace와 Getter Injection으로 구별할 수 있다.
<!--[if !supportLists]-->ü
<!--[endif]-->Method
Replace(메소드 대체) : 기존
메소드를 런타임 중에 새로운 구현으로 대체
<!--[if !supportLists]-->ü
<!--[endif]-->Getter
Injection(게터 주입) : 기존
메소드를 런 타임중에 spring Context로 부터 특정한 빈을 반환하는 새로운 구현으로
대체. Method 주입의 특별한 경우로 Method가
특정 타입의 빈을 반환하도록 선언해 두고(보통 abstract)
런타임 중 실제 반환되는 빈은 Spring Context에서 오도록 하는 방법
[Emp.java]
package ojc1;
public interface Emp
{
public String
work();
}
[Programmer.java]
package ojc1;
public class Programmer implements Emp
{
public String work()
{
return "Programmer
Working...";
}
}
[Designer.java]
package ojc1;
import
java.lang.reflect.Method;
import
org.springframework.beans.factory.support.MethodReplacer;
import
org.springframework.stereotype.Service;
public class Designer implements
MethodReplacer {
public Object
reimplement(Object target, Method method, Object[] args) throws Throwable {
return "Designer
Working...";
}
}
[MethodReplaceTest.java]
package ojc1;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public class MethodReplaceTest
{
Emp
programmer;
public void
setProgrammer(Programmer programmer) {
this.programmer =
programmer;
}
public static void
main(String[] args) {
ApplicationContext
context = new
ClassPathXmlApplicationContext("lookup.xml");
MethodReplaceTest test =
(MethodReplaceTest) context.getBean("methodReplaceTest");
//Programmer의 work()가 아닌 대체자인 Designer의 work()가 실행됨
System.out.println(test.programmer.work());
}
}
[/src/main/resources/lookup.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<bean id="programmer"
class="ojc1.Programmer">
<replaced-method name="work"
replacer="designer" />
</bean>
<bean id="designer"
class="ojc1.Designer" />
<bean id="methodReplaceTest"
class="ojc1.MethodReplaceTest">
<property
name="programmer" ref="programmer"/>
</bean>
</beans>
[Emp.java]
package ojc2;
public abstract class Emp
{
public Emp() {}
public void work()
{
getEmp().work(); //주입받은
객체의 getEmp() 메소드를 사용
}
//getEmp를 주입, Emp가 주입된다.
//Run-Time중에 xml 파일로
부터 빈을 주입받는다.
public abstract Emp getEmp()
;
}
[Programmer.java]
package ojc2;
public class Programmer extends
Emp{
public Emp getEmp()
{
return
this;
}
public void work()
{
System.out.println("프로그래머가
개발을 합니다.");
}
}
[Designer.java]
package ojc2;
public class Designer extends
Emp{
public Emp getEmp()
{
return this;
}
public void work()
{
System.out.println("디자이너가
디자인을 합니다.");
}
}
[/src/main/resources/emp.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="myemp" class="ojc2.Designer" />
-->
<!-- 아래
lookup-method는 메소드를 런타입중에 새로운 구현으로 대체
Getter주입은 Setter Injection의 역으로 생각. getEmp()를 호출할 때마다 다른 myemp가 반환
그러나 Setter Injectioin은 단 한번만 주입 주입되는 메소드명이 반드시 getXXX로 시작할 필요는 없다.
-->
<bean id="emp"
class="ojc2.Emp">
<lookup-method
name="getEmp" bean="myemp" />
</bean>
</beans>
[EmpTest.java]
package ojc2;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public class EmpTest
{
public static void main(String[] args)
throws Exception{
ApplicationContext ctx = new
ClassPathXmlApplicationContext("emp.xml");
Emp emp = (Emp)
ctx.getBean("emp");
emp.work();
}
}
댓글 없음:
댓글 쓰기