SW/Java

Java : Spring : 자동 주입 : 예제, 구현

얇은생각 2020. 6. 11. 07:30
반응형

Java : Spring : 자동 주입 : 예제, 구현

 

자동 주입

Bean을 정의할 떄 주입할 객체는 생성자를 통한 주입이나 setter를 통한 주입을 사용했습니다.

spring에서는 객체를 주입할 떄 자동으로 주입될 수 있도록 설정할 수 있습니다.

자동 주입은 이름, 타입, 생성자를 통할 수 있습니다. auto wire라는 용어로 부릅니다.

 

 

이름을 통한 주입

byName : 빈 객체의 프로퍼티 이름과 정의된 빈의 이름이 같은 것을 찾아 자동으로 주입합니다.

 

 

타입을 통한 주입

byType : 빈 객체의 프로퍼티 타입과 정의된 빈의 타입이 일치할 경우 주입됩니다. 이 떄, 동일 타입의 빈이 두 개 이상 정의되어 있으면 오류가 발생합니다.

 

생성자를 통한 주입

constructor : 생성자의 매개 변수 타입과 정의된 빈의 타입이 일치할 경우 주입됩니다. 이 때, 동일 타입의 빈이 두 개 이상 정의되어 있으면 오류가 발생합니다.

 

 

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<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='obj1' class='kr.co.softcampus.beans.TestBean1'>
		<property name="data1" ref='data_bean1'/>
		<property name="data2" ref='data_bean1'/>
	</bean>
	
	<bean id='data_bean1' class='kr.co.softcampus.beans.DataBean1' scope='prototype'/>
	
	<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'/>
	
	<bean id='obj3' class='kr.co.softcampus.beans.TestBean2' autowire="byType"/>
	
	<bean id='data_bean2' class='kr.co.softcampus.beans.DataBean2'/>
	<!-- <bean class='kr.co.softcampus.beans.DataBean2'/>-->
	
	<bean id='obj4' class='kr.co.softcampus.beans.TestBean3'>
		<constructor-arg ref="data_bean2" index="0"/>
		<constructor-arg ref='data_bean2' index='1'/>
	</bean>
	
	<bean id='obj5' class='kr.co.softcampus.beans.TestBean3' autowire="constructor"/>
	
	<bean id='obj6' class='kr.co.softcampus.beans.TestBean3'>
		<constructor-arg value='100' index='0' type='int'/>
		<constructor-arg value='문자열' index='1'/>
		<constructor-arg ref='data_bean2' index='2'/>
		<constructor-arg ref='data_bean2' index='3'/>
	</bean>
	
	<bean id='obj7' class='kr.co.softcampus.beans.TestBean3' autowire="constructor">
		<constructor-arg value='200' index='0' type='int'/>
		<constructor-arg value='문자열2' index='1'/>
	</bean>
	
	<bean id='obj8' class='kr.co.softcampus.beans.TestBean1'/>
	
	<bean id='obj9' class='kr.co.softcampus.beans.TestBean1' autowire="no"/>
</beans>

 

DataBean1.java

package kr.co.softcampus.beans;

public class DataBean1 {

}

 

DataBean2.java

package kr.co.softcampus.beans;

public class DataBean2 {

}

 

TestBean1.java

package kr.co.softcampus.beans;

public class TestBean1 {
	private DataBean1 data1;
	private DataBean1 data2;
	
	public DataBean1 getData1() {
		return data1;
	}
	public void setData1(DataBean1 data1) {
		this.data1 = data1;
	}
	public DataBean1 getData2() {
		return data2;
	}
	public void setData2(DataBean1 data2) {
		this.data2 = data2;
	}
	
}

 

TestBean2.java

package kr.co.softcampus.beans;

public class TestBean2 {
	private DataBean2 data1;
	private DataBean2 data2;
	
	public DataBean2 getData1() {
		return data1;
	}
	public void setData1(DataBean2 data1) {
		this.data1 = data1;
	}
	public DataBean2 getData2() {
		return data2;
	}
	public void setData2(DataBean2 data2) {
		this.data2 = data2;
	}
	
	
}

 

TestBean3.java

package kr.co.softcampus.beans;

public class TestBean3 {
	private int data1;
	private String data2;
	private DataBean2 data3;
	private DataBean2 data4;
	
	public TestBean3(DataBean2 data3, DataBean2 data4) {
		this.data3 = data3;
		this.data4 = data4;
	}
	
	public TestBean3(int data1, String data2, DataBean2 data3, DataBean2 data4) {
		this.data1 = data1;
		this.data2 = data2;
		this.data3 = data3;
		this.data4 = data4;
	}
	
	public int getData1() {
		return data1;
	}
	public void setData1(int data1) {
		this.data1 = data1;
	}
	public String getData2() {
		return data2;
	}
	public void setData2(String data2) {
		this.data2 = data2;
	}
	public DataBean2 getData3() {
		return data3;
	}
	public void setData3(DataBean2 data3) {
		this.data3 = data3;
	}
	public DataBean2 getData4() {
		return data4;
	}
	public void setData4(DataBean2 data4) {
		this.data4 = data4;
	}
	
}

 

MainClass.java

package kr.co.softcampus.main;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import kr.co.softcampus.beans.TestBean1;
import kr.co.softcampus.beans.TestBean2;
import kr.co.softcampus.beans.TestBean3;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
		
		TestBean1 obj1 = ctx.getBean("obj1", TestBean1.class);
		System.out.printf("obj1.data1 : %s\n", obj1.getData1());
		System.out.printf("obj1.data2 : %s\n", obj1.getData2());
		
		System.out.println("----------------------------------");
		
		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());
		
		System.out.println("-------------------------------------");
		
		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());
		
		System.out.println("---------------------------------------");
		
		TestBean3 obj4 = ctx.getBean("obj4", TestBean3.class);
		System.out.printf("obj4.data1 : %d\n", obj4.getData1());
		System.out.printf("obj4.data2 : %s\n", obj4.getData2());
		System.out.printf("obj4.data3 : %s\n", obj4.getData3());
		System.out.printf("obj4.data4 : %s\n", obj4.getData4());
		
		System.out.println("---------------------------------------");
		
		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());
		
		System.out.println("---------------------------------------");
		
		TestBean3 obj6 = ctx.getBean("obj6", TestBean3.class);
		System.out.printf("obj6.data1 : %d\n", obj6.getData1());
		System.out.printf("obj6.data2 : %s\n", obj6.getData2());
		System.out.printf("obj6.data3 : %s\n", obj6.getData3());
		System.out.printf("obj6.data4 : %s\n", obj6.getData4());
		
		System.out.println("---------------------------------------");
		
		TestBean3 obj7 = ctx.getBean("obj7", TestBean3.class);
		System.out.printf("obj7.data1 : %d\n", obj7.getData1());
		System.out.printf("obj7.data2 : %s\n", obj7.getData2());
		System.out.printf("obj7.data3 : %s\n", obj7.getData3());
		System.out.printf("obj7.data4 : %s\n", obj7.getData4());
		
		System.out.println("----------------------------------------");
		
		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());
		
		System.out.println("----------------------------------------");
		
		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());
		
		ctx.close();
	}

}

 

이번 시간에는 자동 주입 auto wire 개념에 대해 알아보았습니다. 타입, 이름, 생성자 등을 통해 자동 주입을 할 수 있어서, 잘 정의만 되어있다면, 편리하게 사용할 수 있다는 것을 알게 되었습니다.

또한, 종종 스프링 개발을 하다보면, 다양한, auto wire 문법을 활용할 때가 많았는데, 동작하는 방식에 대해 조금이나마 이해할 수 있는 기회가 되었습니다.

구체적엔 구현 방법과 설명은 아래 강좌에서 참조할 수 있습니다.

 

https://www.udemy.com/course/sooftcampus-sfb/

 

초보 Spring Framework 개발자를 위한 실습을 통한 입문 과정 윤재성

Spring Framework 입문을 위한 주제별 실습 및 상세 설명( beginner step1)

www.udemy.com

반응형