반응형
자동 주입
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 문법을 활용할 때가 많았는데, 동작하는 방식에 대해 조금이나마 이해할 수 있는 기회가 되었습니다.
구체적엔 구현 방법과 설명은 아래 강좌에서 참조할 수 있습니다.
반응형
'SW > Java' 카테고리의 다른 글
Java : Spring : Execution 명시자 : 종류,개념, 사용 방법, 예제, 구현 (0) | 2020.06.13 |
---|---|
Java : Spring : AOP 기본 개념, 용어, 구현, 예제 (0) | 2020.06.12 |
Java : Spring : bean 컬렉션 주입 : 개념, 예제, 구현 (0) | 2020.06.10 |
Java : Spring : Bean : Setter 메서드를 통한 의존성 주입 : 예제, 구현 (0) | 2020.04.29 |
Java : Spring : 의존성 주입(Dependency Injection) : 개념, 예제, 구현 (0) | 2020.04.20 |