본문 바로가기

Spring

DI(Dependency Injection) 생성자를 통한 주입

인터넷 강의를 듣고 공부한 내용을 포스팅합니다.

'윤재성의 스프링 프레임워크 개발자를 위한 실습을 통한 입문 과정' 이란 강의를 듣고 있습니다.

 

DI(의존성 주입)

의존성 주입은 Spring에서 중요하고 주요한 개념

bean객체를 생성 할 때 bean 객체가 관리할 값이나 객체를 주입하는 것

bean객체가 가질 기본 값을 자바 코드로 넣어주지 않고bean을 정의할 때 xml코드에서 정의함

 

실습(생략한 코드들은 다 만들어져있다고 가정)

데이터타입인 변수들

public class TestBean {
	
	private int data1;
	private double data2;
	private String data3;
	
	public TestBean() {
		System.out.println("TestBean의 기본 생성자");
		this.data1 = 0;
		this.data2 = 0.0;
		this.data3 = null;
	}
	public TestBean(int data1,double data2,String data3) {
		System.out.println("TestBean의 생성자: 변수3개");
		this.data1 = data1;
		this.data2 = data2;
		this.data3 =data3;
	}
	
	public void printData() {
		System.out.printf("data1 : %d\n",data1);
		System.out.printf("data2 : %f\n",data2);
		System.out.printf("data3 : %s\n",data3);
	}
	
}

 

위와 같은 클래스가 있을 때 Main에서

 

TestBean t5 = new TestBean(200,22.22,"안녕하세요");
t5.printData();
/*
결과
TestBean의 생성자: 변수3개
data1 : 200
data2 : 22.220000
data3 : 안녕하세요
*/

이런식으로 사용했었다. di개념을 적용시키면

<bean id="obj5" class="kr.co.softcampus.beans.TestBean"
	lazy-init="true">
	<constructor-arg value="200" type="int"/>
	<constructor-arg value="22.22" type="double"/>
	<constructor-arg value="안녕하세요" type="java.lang.String"/>
</bean>
TestBean obj5 = ctx.getBean("obj5",TestBean.class);
obj5.printData();
/*
TestBean의 생성자: 변수3개
data1 : 200
data2 : 22.220000
data3 : 안녕하세요
*/

위와 같이 <constructor-arg>태그에 넣어주면 type에 맞춰서 본인이 들어갈 것을 찾아 들어간다. 순서를 바꾸어도 가능

하지만 확실히 index를 정해주어서 넣어주는게 좋다.

 

<bean id="obj7" class="kr.co.softcampus.beans.TestBean"
	lazy-init="true">
	<constructor-arg index="1" value="22.22" type="double"/>
	<constructor-arg index="0" value="300" type="int"/>
	<constructor-arg index="2" value="반갑습니다." type="java.lang.String"/>
</bean>

결과는 같다.

 

클래스를 변수로 가짐

DataBean이라는 클래스를 만들어주고

<bean id="obj8" class="kr.co.softcampus.beans.TestBean2"
	lazy-init="true">
	<constructor-arg>
		<bean class="kr.co.softcampus.beans.DataBean"/>
	</constructor-arg>
	<constructor-arg>
		<bean class="kr.co.softcampus.beans.DataBean"/>
	</constructor-arg>
</bean>

이렇게 넣어줄 수 있고

<bean id="data_bean" class="kr.co.softcampus.beans.DataBean" scope = "prototype"/>
	
<bean id = "obj9" class="kr.co.softcampus.beans.TestBean2"
	lazy-init="true">
	<constructor-arg ref = "data_bean"/>
	<constructor-arg ref = "data_bean"/>
</bean>

이런식으로 bean객체를 생성한 뒤에 넣어줄 수도 있다.

 

끝!