Spring

DI / IoC

heejin424 2023. 1. 30. 18:47
728x90

JAVA 의 Class 상속 / Interface 를 이용한 추상화를 기반으로 하는 개발 방법. 
Spring은 아래 DI/IoC 를 강력하게 지원하는 프레임워크

 

IoC : Inversion of Control
프로그램을 제어하는 패턴 중 하나. 
DI 는 IoC패턴의 구현방법 중 하나.
DI에 따라 프로그램의 흐름이 완전히 변경됨.

 

전반적인 객체를 생성해놓고 관리하는 곳
왜 ioc container라고 부르는가?
박스안에 프로그램이 시작될때 미리 프로그램을 생성해놓는다.

new ~~로 생성하는게 아닌 객체를 불러서 사용?

대표적인 클래스 application-context

 

 



DI : Dependency Injection (의존성주입)
스프링 Container 에 만들어둔 각종 클래스(bean)들은 서로 의존적이다 
A객체가 B객체 없이 동작이 불가능한 상황

클래스를 만들때 가장 이상적인 모형

 

DI 설정방법

2가지 의존성 주입 방법
1. 생성자를 통한 의존성 주입

객체를 집어넣어줄 때 사용하는 속성 ref

<constructor-arg ref="빈id"></constructor-arg>

 

예시 )

오류


2. setter를 통한 의존성 주입
<property name="멤버변수" value="값"/>
<property name="변수명" ref="객체(빈 id)"/>

 

예시 )

오류는 없으나 데이터의 값이 들어가지 않는다.

 


예시 )

생성자/ stter를 통한 의존객체 주입

 

Car.java ( 생성자 주입 )

package ex04;

public class Car {

	private IBattery battery;
	//생성자 주입
	public Car(IBattery battery) {
		this.battery = battery;
	}
	
	//getter
	public IBattery getBattery() {
		return battery;
	}
	
	
}

Airplane.java ( setter 주입 )

package ex04;

public class Airplane {

	private IBattery battery;
	
	public IBattery getBattery() {
		return battery;
	}
	//세터 주입
	public void setBattery(IBattery battery) {
		this.battery = battery;
	}
	
	
}

Battery1 , Battery2 .java

package ex04;

public class Battery1 implements IBattery{

	@Override
	public void energy() {
		System.out.println("에너자이저");
	}
	
}

public class Battery2 implements IBattery{

	@Override
	public void energy() {
		System.out.println("노랑색건전지");
	}
	
}

 

context.xml

	<!-- car는 생성자를 통한 주입, airplane은 setter를 통한 주입 -->
	<bean id="battery1" class="ex04.Battery1" />
	<bean id="battery2" class="ex04.Battery2"></bean>

	<bean id="airplane" class="ex04.Airplane">
		<property name="battery" ref="battery1"></property>
	</bean>
	<bean id="car" class="ex04.Car">
		<constructor-arg ref="battery2"></constructor-arg>
	</bean>

MainClass.java

package ex04;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

	public static void main(String[] args) {

		// Car, Airplane 빈을 생성하고, 의존성 주입
		// 각 객체 안에 있는 배터리를 자바클래스에서 출력.
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("application-context.xml");

		Car car = ctx.getBean(Car.class);
		Airplane airplane = ctx.getBean(Airplane.class);

		car.getBattery().energy();
		airplane.getBattery().energy();
		
	

	}
}
728x90