2020. 8. 17. 22:38ㆍJava/Spring
- Spring에서는 객체를 주입할 때 자동으로 주입될 수 있도록 설정할 수 있다.
- 자동 주입은 이름, 타입, 생성자를 통할 수 있으며 auto wire라는 용어로 부른다.
다음과 같이 빈 클래스를 만든다.
1.기본 자동주입
public class TestBean4 {
private DataBean data1;
private DataBean data2;
public DataBean getData1() {
return data1;
}
public void setData1(DataBean data1) {
this.data1 = data1;
}
public DataBean getData2() {
return data2;
}
public void setData2(DataBean data2) {
this.data2 = data2;
}
public void PrintData() {
System.out.println("==============data1 =>"+ data1 + "===============data2 => "+ data2);
}
}
원래의 객체 주입 방법은 아래와 같이 하였다.
<bean id="t18" class="kr.co.softcampus.beans.TestBean4" init-method="PrintData">
<property name="data1" ref="TestBean4Bean"/>
<property name="data2" ref="TestBean4Bean"/>
</bean>
<bean id="TestBean4Bean" class="kr.co.softcampus.beans.DataBean" scope="prototype"/>
자동 주입을 위해서는 autowire 속성을 설정한다.
<bean id="t19" class="kr.co.softcampus.beans.TestBean4" init-method="PrintData" autowire="byName" />
<bean id="data1" class="kr.co.softcampus.beans.DataBean"/>
<bean id="data2" class="kr.co.softcampus.beans.DataBean"/>
불러올 빈 객체를 선언하고, 그 id를 변수의 이름과 맞게 설정한다.
그리고 주입 할 클래스의 빈 객체의 autowire를 byName으로 설정하면 변수명과 id를 비교하여 값을 주입한다.
타입으로도 자동주입이 가능하다.
public class TestBean5 {
private DataBean3 data1;
private DataBean4 data2;
public DataBean3 getData1() {
return data1;
}
public void setData1(DataBean3 data1) {
this.data1 = data1;
}
public DataBean4 getData2() {
return data2;
}
public void setData2(DataBean4 data2) {
this.data2 = data2;
}
public void PrintData() {
System.out.println("==============data1 =>"+ data1 + "===============data2 => "+ data2);
}
}
해당 클래스에서 알맞은 타입(형)의 빈을 찾아서 주입한다.
<bean id="t20" class="kr.co.softcampus.beans.TestBean5" init-method="PrintData" autowire="byType"/>
<bean class="kr.co.softcampus.beans.DataBean3"/>
<bean class="kr.co.softcampus.beans.DataBean4"/>
data1 에는 자동으로
<bean class="kr.co.softcampus.beans.DataBean3"/>
위의 빈 객체가 주입되고
data2 에는
<bean class="kr.co.softcampus.beans.DataBean4"/
위의 빈 객체가 주입된다.
2.생성자를 통한 자동주입
생성자를 통해서도 자동 주입이 가능하다.
다양한 매개변수를 갖는 생성자를 오버로딩 하여 클래스를 만든다.
public class TestBean6 {
private int data1;
private String data2;
private DataBean3 data3;
private DataBean3 data4;
public TestBean6(DataBean3 data3,DataBean3 data4) {
this.data3=data3;
this.data4=data4;
}
public TestBean6(int data1,String data2,DataBean3 data3,DataBean3 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 DataBean3 getData3() {
return data3;
}
public void setData3(DataBean3 data3) {
this.data3 = data3;
}
public DataBean3 getData4() {
return data4;
}
public void setData4(DataBean3 data4) {
this.data4 = data4;
}
public void PrintData() {
System.out.println("data1=>"+data1+" data2=> "+data2+" data3=>"+data3+" data4=> "+data4);
}
}
생성자를 통한 수동 주입은 아래와 같이 하였다.
<bean id="t21" class="kr.co.softcampus.beans.TestBean6" init-method="PrintData">
<constructor-arg ref="Data3" index="0"></constructor-arg>
<constructor-arg ref="Data3" index="1"></constructor-arg>
</bean>
<bean id="t22" class="kr.co.softcampus.beans.TestBean6" init-method="PrintData">
<constructor-arg value="100" index="0" />
<constructor-arg value="Data3" index="1" />
<constructor-arg ref="Data3" index="2"></constructor-arg>
<constructor-arg ref="Data3" index="3"></constructor-arg>
</bean>
자동 주입은 객체만 가능하고 int나 String은 수동으로 주입을 해야한다.
<bean id="t23" class="kr.co.softcampus.beans.TestBean6" init-method="PrintData" autowire="constructor">
<constructor-arg value="100" index="0" />
<constructor-arg value="Data3" index="1" />
</bean>
위 처럼 문자열이나 자료형의 경우에는 수동으로 주입하고, autowire="constructor" 을 준다면 객체타입은 자동으로 주입된다.
만약 bean에 autowire을 선언하지 않은 태그들 모두에게 자동주입을 하고싶으면 겉의 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"
>
위 처럼 추가하면 autowire 가 없는 태그들은 byName을 따라서 자동주입이 된다.
만약 이 자동주입을 원하지 않는다면
<bean id="t25" class="kr.co.softcampus.beans.TestBean4" init-method="PrintData" autowire="no"/>
위 태그처럼 autowire='no'를 해준다.
.
.
.
.
- byName : 빈 객체의 프로퍼티 이름과 정의된 빈의 이름이 같은 것을 찾아 자동으로 주입한다.
- byType : 빈 객체의 프로퍼티 타입과 정의된 빈의 타입이 일치할 경우 주입된다.
(이 때, 동일 타입의 빈이 두 개 이상 정의되어 있으면 오류가 발생한다.)
- constructor : 생성자의 매개 변수 타입과 정의된 빈의 타입이 일치할 경우 주입된다.
(이 때, 동일 타입의 빈이 두 개 이상 정의되어 있으면 오류가 발생한다.)
'Java > Spring' 카테고리의 다른 글
Spring - Java를 이용한 init-method, destroy-method (0) | 2020.08.19 |
---|---|
Spring - Java를 이용한 Bean 등록(어노테이션) (0) | 2020.08.18 |
Spring - 빈 객체 값 주입(컬렉션) (0) | 2020.08.17 |
Spring - 빈 객체 값 주입 (Setter 메소드) (0) | 2020.08.17 |
Spring - 빈 객체 값 주입(생성자) (0) | 2020.08.17 |