본문 바로가기

Spring

DI(Dependency Injection) 자동주입

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

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

 

자동주입

이전 포스팅 처럼 생성자를 통한 주입이나 setter를 통한 주입을 사용했다. Spring에서는 객체를 주입할 때 자동으로 주입 될 수 있도록 설정할 수 있다.

 

이름을 통한 주입

<bean id="obj2" class="kr.co.softcampus.beans.TestBean1"
	autowire="byName"/>
<bean id="data1" class="kr.co.softcampus.beans.DataBean1"/>
<bean id="data2" class="kr.co.softcampus.beans.DataBean1"/>

 

TestBean1 obj2 = ctx.getBean("obj2",TestBean1.class);
System.out.printf("obj2.data1 : %s\n",obj2.getData1());
System.out.printf("obj2.data2 : %s\n",obj2.getData2());

/*
결과
obj2.data1 : kr.co.softcampus.beans.DataBean1@46daef40
obj2.data2 : kr.co.softcampus.beans.DataBean1@12f41634
*/

빈 객체의 id와 class에 정의되어있는 이름이 같은 것을 자동으로 연결한다.

 

타입을 통한 주입

<bean id="obj3" class="kr.co.softcampus.beans.TestBean2" autowire="byType"/>
<bean id="data_bean2" class="kr.co.softcampus.beans.DataBean2" />
TestBean2 obj3 = ctx.getBean("obj3",TestBean2.class);
System.out.printf("obj3.data1 : %s\n", obj3.getData1());
System.out.printf("obj3.data2 : %s\n", obj3.getData2());

/*
결과
obj3.data1 : kr.co.softcampus.beans.DataBean2@13c27452
obj3.data2 : kr.co.softcampus.beans.DataBean2@13c27452
*/

빈객체의 프로퍼티 타입과 class에 정의되어있는 타입이 일치할 경우 자동주입된다.

※이 때 동일 타입의 빈이 두 개 이상 정의되어있으면 오류 발생

 

생성자를 통한 주입

private int data1;
private String data2;
private DataBean2 data3;
private DataBean2 data4;

TestBean3에 정의된 객체들

<bean id="obj5" class="kr.co.softcampus.beans.TestBean3" autowire="constructor"/>
TestBean3 obj5 = ctx.getBean("obj5",TestBean3.class);
System.out.printf("obj5.data1 : %d\n", obj5.getData1());
System.out.printf("obj5.data2 : %s\n", obj5.getData2());
System.out.printf("obj5.data3 : %s\n", obj5.getData3());
System.out.printf("obj5.data4 : %s\n", obj5.getData4());

/*
결과
obj5.data1 : 0
obj5.data2 : null
obj5.data3 : kr.co.softcampus.beans.DataBean2@13c27452
obj5.data4 : kr.co.softcampus.beans.DataBean2@13c27452
*/

넣어주지않은 것 제외하고 출력되는 것 확인

 

default-autowire

autowire의 default값을 설정해줄 수 있다.

<beans>태그에 default-autowire속성을 주면 된다

<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"
default-autowire="byName">

이렇게 되면

<bean id="obj8" class="kr.co.softcampus.beans.TestBean1"/>
TestBean1 obj8 = ctx.getBean("obj8",TestBean1.class);
System.out.printf("obj8.data1 : %s\n",obj8.getData1());
System.out.printf("obj8.data2 : %s\n",obj8.getData2());

/*
결과
obj8.data1 : kr.co.softcampus.beans.DataBean1@46daef40
obj8.data2 : kr.co.softcampus.beans.DataBean1@12f41634
*/

위에서 생성해 놓은 bean객체 '이름을 통한 자동주입' 발생

 

default값을 적용시키기 싫다면

<bean id="obj9" class="kr.co.softcampus.beans.TestBean1" autowire="no"/>
TestBean1 obj9 = ctx.getBean("obj9",TestBean1.class);
System.out.printf("obj9.data1 : %s\n",obj9.getData1());
System.out.printf("obj9.data2 : %s\n",obj9.getData2());

/*
결과
obj9.data1 : null
obj9.data2 : null
*/

 

끝!!