2013년 9월 26일 목요일

[스프링3.2강좌]스프링 인젝션, 세터주입,생성자주입,자바교육,Spring Dependency Injection, 스프링DI(스프링프레임워크교육강좌)

[스프링3.2강좌]스프링 인젝션, 세터주입,생성자주입,자바교육,Spring Dependency Injection, 스프링DI(스프링프레임워크교육강좌)   -Setter Injection 
 
-Setter Injection : class 사이의 의존관계를 연결시키기 위해 setter 메소드를 이용하는 방법.
 
-Constructor Injection : class 사이의 의존관계를 연결시키기 위해 생성자를 이용하는 방법.
 
-Method Injection : Method Injection은 Setter Injection과 Constructor Injection이 가지고 있는 한계점을 극복하기 위하여 Spring 프레임워크 1.1 버전에서 새롭게 지원하고 있는 DI의 한 종류이다. Singleton 인스턴스와 Non Singleton 인스턴스의 의존관계를 연결할 필요가 있을 때 사용한다.

생성자 주입은 컴포넌트를 사용하기 전에 의존 해야하는 클래스의 인스턴스를 가지고 있어야 할 때 유용하며 세터주입은 부모 컴포넌트의 새 인스턴스를 생성하지 않고 동적으로 각기 다른 구현을 사용해 의존성을 대체할 수 있다. 즉 의존성을 인터페이스로 선언할 수 있다는 점이 장점이며 덜 강압적인 주입이라 할 수 있다.
 
기본 생성자만 있는 클래스에 생성자 주입을 정의하면 비 IoC 환경에서 해당 클래스를 사용하는 모든 클래스에 영향을 주게 된다. 하지만 세터 주입의 경우 다른 클래스가 이 클래스와 상호작용 하는데 있어 영향을 덜 주게 된다.
 
일반적으로 세터 주입을 이용하는 것이 좋다. 이 방식은 비 IoC 설정에서 코드를 사용하는데 최소한의 영향만을 주기 때문이다. 생성자 주입은 컴포넌트로 항상 의존성이 전달되게 할 때 적합하다.

1. Setter Injection(XML 기반)
 
[Audi.java]
private Car car;
public void setCar(Car car) {
 this.car = car;
}

[xmlBeanFactory.xml]
<bean id="car" class="onj.spring.di.Car"/>
<bean id="audi" class="onj.spring.di.Audi">
 <property name="car"><ref bean="car"/></property>
</bean>
</beans>

2. Setter Injection(Annotation 기반)
 
[ Audi.java]
private Car car;
public void setCar(Car car) {
 this.car = car;
}
 
[Car.java]
    - Audi setCar가 Wired 될때 인자로 필요하므로 @Service로 주입될 빈이라고 표시해야 함
@Service("car“)
public class Car {
private String name; 
  public Car() {
  } … …
 
[xmlBeanFactory.xml]
 
<description>Example configuration to get you started.</description>
<context:annotation-config/>
<context:component-scan base-package="onj.spring.di" />
</beans>
 

3. Constructor Injection(XML 기반)

[Audi.java]
 
public class Audi implements CarMaker {
private Car car;
public Audi(Car car) {  //생성자에 주입
 this.car = car;
}
public Car sell() {
 this.car.setName("Audi A6");
 return car;
}
}
 
 
[xmlBeanFactory.xml]
<bean id="car" class="onj.spring.di2.Car"/>
<bean id="audi" class="onj.spring.di2.Audi">
<constructor-arg name="car"><ref bean="car"/></constructor-arg>
</bean>
</beans>
 

4. Method  Injection : Method 정의 전체에 Bean을 주입하는 것
 
- Method Replace(메소드 대체) : 기존 메소드를 런타임 중에 새로운 구현으로 대체

-  Getter Injection(게터 주입) : 기존 메소드를 런 타임중에 spring Context로 부터 특정한 빈을 반환하는 새로운 구현으로 대체. Method 주입의 특별한 경우로 Method가 특정 타입의 빈을 반환하도록 선언해 두고(보통 abstract) 런타임 중 실제 반환되는 빈은 Spring Context에서 오도록 하는 방법

Method Replace
   [Magictian.java]

package magic;
public class Magician {
public Magician() {}
  public void magic() {
    System.out.println("마술을 시작합니다.");
    System.out.println("마술상자에는 무엇이 있을까요?");
    System.out.println(" 짜잔 --> " + magicBox.getContents()); //마술상자안의 내용물 확인
  }
  //마술상자를 주입
  private MagicBox magicBox;
  public void setMagicBox(MagicBox magicBox) {
    this.magicBox = magicBox;
  }
  private String magicWords;
  public void setMagicWords(String magicWords) {
    this.magicWords = magicWords;
  }
}
 
Method Replace
   [MagicBox.java, MagicBoxImpl.java]
package magic;
public interface MagicBox {
    public String getContents();
}
package magic;
public class MagicBoxImpl implements MagicBox{
  public MagicBoxImpl() {}
  public String getContents() {
    return "아름다운 아가씨";   //최초 마술상자에는 아름다운 아가씨가 있다.
  } 
}
 
 Method Replace
   [Tiger.java]
 
//spring xml파일(magic.xml)에서 메소드 대체되는 Tiger객체. 
//MethodReplacer의 reimplement 메소드를 재정의하면 된다.
package magic;
import java.lang.reflect.Method;
import org.springframework.beans.factory.support.MethodReplacer;
public class Tiger implements MethodReplacer {
 public Object reimplement(Object target, Method method, Object[] args)  throws Throwable {    
     return "난 호랑이다 어흥~!!";
    }
}
 
 Method Replace
   [MagicTest.java]

package magic;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MagicTest {
  public static void main(String[] args) throws Exception{
    ApplicationContext ctx = new ClassPathXmlApplicationContext("magic.xml");
    Magician magician = (Magician) ctx.getBean("magician");
    magician.magic();
  }
}
 

 Method Replace
   [magic.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>  
  <bean id="magician" class="magic.Magician">
    <property name="magicBox" ref="magicBox" />
    <property name="magicWords" value="수리수리마수리!!!" />
  </bean>
 
  <bean id="magicBox" class="magic.MagicBoxImpl">
    <replaced-method name="getContents" replacer="tiger" />
  </bean>
  
  <bean id="tiger" class="magic.Tiger" />
</beans>

----------------------------------------------------

 Getter Injection
   [Emp.java]
package emp;
public abstract class Emp {
public Emp() {}
  public void work() {
    getEmp().work(); //주입된 getEmp() 메소드를 사용
  }
  //getEmp를 주입, Emp가 주입된다.
  //Run-Time중에 xml 파일로 부터 빈을 주입받는다.
  public abstract Emp getEmp() ;
}
 
 Getter Injection
   [Programmer.java]
package emp;
public class Programmer extends Emp{
    public Emp getEmp() {
    return this;
    }
    
    public void work() {
    System.out.println("프로그래머가 개발을 합니다.");
    }
}

 Getter Injection
   [Designer.java]

package emp;
public class Designer extends Emp{
    public Emp getEmp() {
    return this;
    }
    
    public void work() {
    System.out.println("디자이너가 디자인을 합니다.");
    }
}

 Getter Injection
   [WEB-INF/src/emp.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>  
  <bean id="myemp" class="emp.Programmer" />
  <!-- <bean id="myemp" class="emp.Designer" /> -->
  
  <!-- 아래 lookup-method는 메소드를 런타입중에 새로운 구현으로 대체 
       Getter주입은 Setter Injection의 역 으로 생각. 
       getEmp()를 호출할 때마다 다른 myemp가 반환 
                  그러나 Setter Injectioin은 단 한번만 주입
       주입되는 메소드명이 반드시 getXXX로 시작할 필요는 없다. -->
  <bean id="emp" class="emp.Emp">
    <lookup-method name="getEmp" bean="myemp"/>
  </bean>
</beans>
 
 Getter Injection
   [EmpTest.java]

package emp;
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();
  }
}


[개강안내]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)

[주말]
  [9/28]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 
  [9/28]SQL초보에서실전전문가까지 
  [9/28]C#,ASP.NET마스터
  [9/28]웹퍼블리싱 마스터 
  [10/5]Spring3.X, MyBatis, Hibernate실무과정 
  [10/5]스프링3.X게시판&오라클힌트,SQL튜닝,사례연구
[평일주간]
  [10/4]PL/SQL,오라클힌트,SQL튜닝,사례연구
  [10/8]스프링3.X게시판&오라클힌트,SQL튜닝,사례연구
  [10/8]C#4.0, ADO.NET, Network 프로그래밍 
  [10/10]Spring3.X, MyBatis, Hibernate실무과정
  [10/10]SQL초보에서실전전문가까지
  [10/10]C#,ASP.NET마스터 
[평일야간]
  [10/4]SQL초보에서실전전문가까지
  [10/4]자바초보에서안드로이드까지
  [10/4]C#,ASP.NET마스터
  [10/8]스프링3.X게시판&오라클힌트,SQL튜닝,사례연구
  [10/10]JAVA&WEB프레임워크실무과정
  [10/16]Spring3.X, MyBatis, Hibernate실무과정

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터
(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  

댓글 없음:

댓글 쓰기