레이블이 spring di인 게시물을 표시합니다. 모든 게시물 표시
레이블이 spring di인 게시물을 표시합니다. 모든 게시물 표시

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