[스프링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 인스턴스의 의존관계를 연결할 필요가 있을 때 사용한다.
-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;
}
this.car = car;
}
[xmlBeanFactory.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.xsd">
<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.xsd">
<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>
<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;
}
this.car = car;
}
[Car.java]
- Audi setCar가 Wired 될때 인자로 필요하므로 @Service로 주입될 빈이라고 표시해야 함
@Service("car“)
public class Car {
private String name;
public Car() {
} … …
public class Car {
private String name;
public Car() {
} … …
[xmlBeanFactory.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-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<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-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<description>Example configuration to get you started.</description>
<context:annotation-config/>
<context:component-scan base-package="onj.spring.di" />
<context:component-scan base-package="onj.spring.di" />
</beans>
3. Constructor Injection(XML 기반)
[Audi.java]
public class Audi implements CarMaker {
private Car car;
private Car car;
public Audi(Car car) { //생성자에 주입
this.car = car;
}
this.car = car;
}
public Car sell() {
this.car.setName("Audi A6");
return car;
}
}
this.car.setName("Audi A6");
return car;
}
}
[xmlBeanFactory.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.xsd">
<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>
<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]
[MagicBox.java, MagicBoxImpl.java]
package magic;
public interface MagicBox {
public String getContents();
}
public String getContents();
}
package magic;
public class MagicBoxImpl implements MagicBox{
public MagicBoxImpl() {}
public String getContents() {
return "아름다운 아가씨"; //최초 마술상자에는 아름다운 아가씨가 있다.
}
}
public MagicBoxImpl() {}
public String getContents() {
return "아름다운 아가씨"; //최초 마술상자에는 아름다운 아가씨가 있다.
}
}
Method Replace
[Tiger.java]
[Tiger.java]
//spring xml파일(magic.xml)에서 메소드 대체되는 Tiger객체.
//MethodReplacer의 reimplement 메소드를 재정의하면 된다.
//MethodReplacer의 reimplement 메소드를 재정의하면 된다.
package magic;
import java.lang.reflect.Method;
import org.springframework.beans.factory.support.MethodReplacer;
import org.springframework.beans.factory.support.MethodReplacer;
public class Tiger implements MethodReplacer {
public Object reimplement(Object target, Method method, Object[] args) throws Throwable {
return "난 호랑이다 어흥~!!";
}
}
public Object reimplement(Object target, Method method, Object[] args) throws Throwable {
return "난 호랑이다 어흥~!!";
}
}
Method Replace
[MagicTest.java]
[MagicTest.java]
package magic;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MagicTest {
public static void main(String[] args) throws Exception{
ApplicationContext ctx = new ClassPathXmlApplicationContext("magic.xml");
public static void main(String[] args) throws Exception{
ApplicationContext ctx = new ClassPathXmlApplicationContext("magic.xml");
Magician magician = (Magician) ctx.getBean("magician");
magician.magic();
}
}
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>
<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() ;
}
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]
[Programmer.java]
package emp;
public class Programmer extends Emp{
public Emp getEmp() {
return this;
}
public void work() {
System.out.println("프로그래머가 개발을 합니다.");
}
}
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("디자이너가 디자인을 합니다.");
}
}
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]
[EmpTest.java]
package emp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class EmpTest {
public static void main(String[] args) throws Exception{
ApplicationContext ctx = new ClassPathXmlApplicationContext("emp.xml");
public static void main(String[] args) throws Exception{
ApplicationContext ctx = new ClassPathXmlApplicationContext("emp.xml");
Emp emp = (Emp) ctx.getBean("emp");
emp.work();
}
}
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실무과정
[주말]
[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,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)
댓글 없음:
댓글 쓰기