2020년 7월 18일 토요일

Spring DI(Dependency Injection), 세터 주입(Setter Injection), XML, 어노테이션기반, 생성자 주입(Constructor Injection) – XML 기반, 어노테이션기반, 메소드 주입(Method Injection)

Spring DI(Dependency Injection), 세터 주입(Setter Injection), XML, 어노테이션기반, 생성자 주입(Constructor Injection) – XML 기반, 어노테이션기반, 메소드 주입(Method Injection)

http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=835

2-5. Spring DI(Dependency Injection)

2-5-1. 세터 주입(Setter Injection) – XML 기반

n 세터주입은 클래스 사이의 의존관계를 연결시키기 위해 setter 메소드를 이용하는 방법이다.

[Emp.java]

package edu.ojc.setter1;

interface Emp {

public abstract void gotoOffice();

public abstract void getoffWork();

}

[Programmer.java]

package edu.ojc.setter1;

class Programmer implements Emp {

public void gotoOffice() {

System.out.println("프로그래머 출근 합니다.");

}

public void getoffWork() {

System.out.println("프로그래머 퇴근 합니다.");

}

}

[Designer.java]

package edu.ojc.setter1;

class Designer implements Emp {

public void gotoOffice() {

System.out.println("디자이너 출근 합니다.");

}

public void getoffWork() {

System.out.println("디자이너 퇴근 합니다.");

}

}

[Develop.java]

package edu.ojc.setter1;

public class Develope {

Emp emp;

public void setEmp(Emp emp) {

this.emp = emp;

}

void coding() {

emp.gotoOffice();

System.out.println("개발합니다...");

emp.getoffWork();

}

}

[Src/main/resources/ojc1.xml]p 네임스페이스를 이용한 세터주입

<?xml version="1.0" encoding="UTF-8"?>

<bean id="programmer" class="edu.ojc.setter1.Programmer" />

<bean id="designer" class="edu.ojc.setter1.Designer" />

<bean id="develope" class="edu.ojc.setter1.Develope" p:emp-ref="programmer" />

<!--

//아래처럼 Property 태그를 이용해도 된다.

<bean id="develope" class="edu.ojc.setter1.Develope">

<property name="emp“><ref bean="programmer"/></property>

</bean>

<bean id="develope" class="edu.ojc.setter1.Develope">

<property name="emp" ref="programmer"/> </bean>

-->

</beans>

[TestMain.java]

package edu.ojc.setter1;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("ojc1.xml");

Develope dev = (Develop)context.getBean("develope");

dev.coding();

}

}

2-5-2. 세터 주입(Setter Injection) – 어노테이션 기반

[Emp.java]

package edu.ojc.setter2;

interface Emp {

public abstract void gotoOffice();

public abstract void getoffWork();

}

[Programmer.java]

package edu.ojc.setter2;

import org.springframework.stereotype.Service;

@Service

class Programmer implements Emp {

public void gotoOffice() {

System.out.println("프로그래머 출근 합니다.");

}

public void getoffWork() {

System.out.println("프로그래머 퇴근 합니다.");

}

}

[Designer.java]

package edu.ojc.setter2;

import org.springframework.stereotype.Service;

@Service

class Designer implements Emp {

public void gotoOffice() {

System.out.println("디자이너 출근 합니다.");

}

public void getoffWork() {

System.out.println("디자이너 퇴근 합니다.");

}

}

[Develop.java]

package edu.ojc.setter2;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.stereotype.Service;

@Service

public class Develope {

Emp emp;

@Autowired

@Qualifier("programmer")

public void setEmp(Emp emp) {

this.emp = emp;

}

void coding() {

emp.gotoOffice();

System.out.println("개발합니다...");

emp.getoffWork();

}

}

[Src/main/resources/ojc2.xml]

[TestMain.java]

package edu.ojc.setter2;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("ojc1.xml");

Develope dev = (Develop)context.getBean("develope");

dev.coding();

}

}

2-5-3. 생성자 주입(Constructor Injection) – XML 기반

[Emp.java]

package edu.ojc.constructor1;

interface Emp {

public abstract void gotoOffice();

public abstract void getoffWork();

}

[Programmer.java]

package edu.ojc.constructor1;

class Programmer implements Emp {

public void gotoOffice() {

System.out.println("프로그래머 출근 합니다.");

}

public void getoffWork() {

System.out.println("프로그래머 퇴근 합니다.");

}

}

[Designer.java]

package edu.ojc.constructor1;

class Designer implements Emp {

public void gotoOffice() {

System.out.println("디자이너 출근 합니다.");

}

public void getoffWork() {

System.out.println("디자이너 퇴근 합니다.");

}

}

[Develop.java]

package edu.ojc.constructor1;

public class Develope {

Emp emp;

public Develope(Emp emp) {

this.emp = emp;

}

void coding() {

emp.gotoOffice();

System.out.println("개발합니다...");

emp.getoffWork();

}

}

[Src/main/resources/ojc3.xml] – C 네임스페이스를 이용한 세터주입

<?xml version="1.0" encoding="UTF-8"?>

<bean id="programmer" class="edu.ojc.constructor1.Programmer" />

<bean id="designer" class="edu.ojc.constructor1.Designer" />

<bean id="develope" class="edu.ojc.constructor1.Develope" c:emp-ref="programmer" />

<!--

<bean id="develope" class="edu.ojc.constructor1.Develope">

<constructor-arg ref="programmer"/>

</bean>

-->

</beans>

[TestMain.java]

package edu.ojc.constructor1;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("ojc3.xml");

Develope dev = (Develope)context.getBean("develope");

dev.coding();

}

}

2-5-4. 생성자 주입(Constructor Injection) – 어노테이션 기반

[Emp.java]

package edu.ojc.constructor2;

interface Emp {

public abstract void gotoOffice();

public abstract void getoffWork();

}

[Programmer.java]

package edu.ojc.constructor2;

import org.springframework.stereotype.Service;

@Service

class Programmer implements Emp {

public void gotoOffice() {

System.out.println("프로그래머 출근 합니다.");

}

public void getoffWork() {

System.out.println("프로그래머 퇴근 합니다.");

}

}

[Designer.java]

package edu.ojc.constructor2;

import org.springframework.stereotype.Service;

@Service

class Designer implements Emp {

public void gotoOffice() {

System.out.println("디자이너 출근 합니다.");

}

public void getoffWork() {

System.out.println("디자이너 퇴근 합니다.");

}

}

[Develop.java]

package edu.ojc.constructor2;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.stereotype.Service;

@Service

public class Develope {

Emp emp;

@Autowired

public Develope(@Qualifier(value="programmer") Emp emp) {

this.emp = emp;

}

void coding() {

emp.gotoOffice();

System.out.println("개발합니다...");

emp.getoffWork();

}

}

[Src/main/resources/ojc4.xml]

[TestMain.java]

package edu.ojc.constructor2;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("ojc4.xml");

Develope dev = (Develop)context.getBean("develope");

dev.coding();

}

}

n 세터주입 또는 생성자 주입에서 멀티 아규멘트 처리방법

<bean id="myButton" class="java.awt.Button">

<property name="bounds" ref="rectangle"/>

<property name="label" value="Click me..."/>

</bean>

<bean id="rectangle" class="java.awt.Rectangle">

<constructor-arg value="0"/>

<constructor-arg value="0"/>

<constructor-arg value="100"/>

<constructor-arg value="10"/>

</bean>

<bean id="name" class="com.erjablow.Name" scope="prototype"p:givenName="Ming"

p:middleName="the"

p:surName="Merciless"/>

<bean id="someobject" class="SomeClass" />

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">

<property name="targetObject"><ref local="someobject"/></property>

<property name="targetMethod"><value>set</value></property>

<property name="arguments">

<list>

<value> "String1" </value>

<value> "String2" </value>

</list>

</property>

</bean>

2-5-5. 메소드 주입(Method Injection)

n Method 정의 전체에 Bean을 주입하는 것으로 Method Replace와 Getter Injection으로 구별할 수 있다.

ü Method Replace(메소드 대체) : 기존 메소드를 런타임 중에 새로운 구현으로 대체

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

2-5-5-1. Method Injection(Method Replace)

[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"?>

<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>

2-5-5-2. Method Injection(Getter Injection)

[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"?>

<!-- <bean id="myemp" class="ojc2.Designer" /> -->

<bean id="myemp" class="ojc2.Programmer" />

<!-- 아래 lookup-method는 메소드를 런타임 중에 새로운 구현으로 대체

Getter주입은 Setter Injection의 역으로 생각.

getEmp()를 호출할 때마다 다른 myemp가 반환

그러나 Getter Injectioin은 단 한번만 주입되는 메소드명이 반드시 getXXX로 시작할 필요는 없다. -->

<bean id="emp" class="ojc2.Emp">

<!— 메소드 getEmp()에 myemp 라는 빈이 주입된다 à

<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();

}

}

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...