2016년 11월 16일 수요일

[자바교육,스프링교육(Spring Framework/Boot)추천_탑크리에듀]#14.스프링DI(메소드 주입,메소드 대체,게터주입)

#14.스프링DI(메소드 주입,메소드 대체,게터주입)

메소드 주입(Method  Injection)

n  Method 정의 전체에 Bean을 주입하는 것으로 Method Replace Getter Injection으로 구별할 수 있다.
ü  Method Replace(메소드 대체) : 기존 메소드를 런타임 중에 새로운 구현으로 대체
ü  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();
  }
}


댓글 없음:

댓글 쓰기