-
9장 DI 자동주입스프링 프레임워크 기초 공부 2020. 4. 27. 01:03
package kr.co.softcampus.beans; public class DataBean1 { }
DataBean1클래스
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; } }
TestBean1클래스
<?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"> <!-- 직접주입방법 --> <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'/><!-- 주입될때마다 새로운객체생성 -->
위 xml은 직접 주입해주는 방법이다
1. TestBean1객체를 생성하여 obj1라는 id만든다
2. 주입할때 마다 새로운 객체를 만드는 scope='prototype을 사용하여 DataBean1객체를 생성한다
3.setter 주입을 사용하여 2번에서 만든 DataBean1객체를 data1에 data2에 각각 주입시킨다.
<!-- 자동주입방법 --> <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'/>
위 xml은 자동으로 주입해주는 방법이다
autowire="byname"을 사용하면 빈 객체의 프로터피와 정의된 빈의 이름이 같은 것을 찾아 자동으로 주입해준다
자동주입은 클래스 객체타입만 가능하다 정수형이나 문자열타입은 직접주입해줘야함
package kr.co.softcampus.main; import org.springframework.context.support.ClassPathXmlApplicationContext; import kr.co.softcampus.beans.TestBean1; import kr.co.softcampus.beans.TestBean2; 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.println(obj1.getData1()); System.out.println(obj1.getData2()); System.out.println("------------------------"); TestBean1 obj2 = ctx.getBean("obj2",TestBean1.class); System.out.println(obj2.getData1()); System.out.println(obj2.getData2()); ctx.close();//ioc컨테이너 해제 객체들 소멸됨 } }
직접 주입과 자동 주입을 main클래스에 객체화한 후 결과를 보겠다.
결과창
kr.co.softcampus.beans.DataBean1@15b204a1
kr.co.softcampus.beans.DataBean1@77167fb7
------------------------
kr.co.softcampus.beans.DataBean1@1fe20588
kr.co.softcampus.beans.DataBean1@6ce139a4직접주입과 자동주입 두 방법다 객체가 잘 주입된것을 볼 수 있다.
타입을 통한 주입
TestBean2 클래스
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; } }
xml
<bean id='obj3' class="kr.co.softcampus.beans.TestBean2" autowire="byType"/> <bean class='kr.co.softcampus.beans.DataBean2'/>
TestBean2객체에서 프로퍼티 타입이 DataBean2가 있다면 자동으로 주입시켜줍니다
(이때 DataBean2객체가 한개이상 선언되어있다면 오류가 발생합니다)
main 클래스
package kr.co.softcampus.main; import org.springframework.context.support.ClassPathXmlApplicationContext; import kr.co.softcampus.beans.TestBean1; import kr.co.softcampus.beans.TestBean2; public class MainClass { public static void main(String[] args) { // TODO Auto-generated method stub ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml"); TestBean2 obj3 = ctx.getBean("obj3", TestBean2.class); System.out.println(obj3.getData1()); System.out.println(obj3.getData2()); ctx.close();// ioc컨테이너 해제 객체들 소멸됨 } }
출력창
kr.co.softcampus.beans.DataBean2@4f933fd1 kr.co.softcampus.beans.DataBean2@4f933fd1
생성자를 통한 주입
TestBean3
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; } }
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" > <bean id='data_bean2' class='kr.co.softcampus.beans.DataBean2'/> <!-- <bean class='kr.co.softcampus.beans.DataBean2'/>--> <bean id='obj5' class='kr.co.softcampus.beans.TestBean3' autowire="constructor"/> </beans>
생성자의 매개변수타입과 xml에서 생성된 객체의 타입이 같다면 자동으로 주입시켜줍니다.
main class
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"); 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()); ctx.close(); } }
출력창
obj5.data1 : 0 obj5.data2 : null obj5.data3 : kr.co.softcampus.beans.DataBean2@28feb3fa obj5.data4 : kr.co.softcampus.beans.DataBean2@28feb3fa
xml 파일 namespace에 기본 자동주입설정 -> bean객체를 생성할때 autowire가 선언되있지않은 객체는 모두 이 기본값이 적용됨
<?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='obj9' class='kr.co.softcampus.beans.TestBean1' autowire="no"/>
'스프링 프레임워크 기초 공부' 카테고리의 다른 글
11장 어노테이션을 이용한 빈 설정 (0) 2020.04.30 10장 자바코드를 활용한 bean 만들기 (0) 2020.04.29 8장 setter 메소드를 통한 주입 (0) 2020.04.27 7장 di 생성자를 이용한 주입 (0) 2020.04.27 6장 bean 객체 생성하기 (0) 2020.04.26