-
10장 자바코드를 활용한 bean 만들기스프링 프레임워크 기초 공부 2020. 4. 29. 13:11
@Configuration 어노테이션은 현재 자바 파일이 빈 등록을 위한 자바 파일임을 알려준다.
xml파일을 로딩할때는 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("xml파일위치");
이렇게 ClassPathXmlApplicationContext를 사용하였다
하지만
자바파일을 로딩할때는 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(자바파일이름.class);
이렇게 AnnotationConfigApplicationContext를 사용하여 로딩한다.
@Bean
@Bean 어노페이션은 bean 객체를 정의할 때 사용한다.
메서드의 이름이 bean의 이름이 된다
@Bean(name=이름):bean의 이름을 새롭게 정의한다.
@Lazy:lazy-init속성을 지정한다.
@Scope:bean의 scope를 설정한다.
@Primary:primary속성을 지정한다.
xml과 java 비교
package kr.co.softcampus.beans; public class TestBean1 { public TestBean1() { System.out.println("TestBean1 생성자"); } }
-TestBean1 클래스-
package kr.co.softcampus.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import kr.co.softcampus.beans.TestBean1; @Configuration public class BeanConfigClass { @Bean public TestBean1 java1() { TestBean1 t1 = new TestBean1(); return t1;//객체의 주소값을 반환 } }
-java로 bean객체 정의-
<?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='xml1' class = 'kr.co.softcampus.beans.TestBean1'/> </beans>
-xml로 bean객체 정의-
package kr.co.softcampus.main; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import kr.co.softcampus.beans.TestBean1; import kr.co.softcampus.config.BeanConfigClass; public class MainClass { public static void main(String[] args) { // TODO Auto-generated method stub //xml ClassPathXmlApplicationContext ctx1 = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml"); TestBean1 t1 = ctx1.getBean("xml1",TestBean1.class); System.out.println(t1); ctx1.close(); System.out.println("=========="); //java AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(BeanConfigClass.class);//BeanConfigClass.class에 셋팅되어져있는 어노테이션들을 확인 @Bean이 있으면 그곳이 bean을 정의한곳 그래서 그 메소드를 자동호출 TestBean1 t2 = ctx2.getBean("java1",TestBean1.class); System.out.println(t2); ctx2.close(); } }
-main class-
객체 주입
(생성자주입,setter주입)
<?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='xml1' class='kr.co.softcampus.beans.TestBean1' lazy-init="true"> <constructor-arg value='100' index='0'/> <constructor-arg value='문자열1' index='1'/> <constructor-arg ref='data_bean1' index='2'/> </bean> <!-- setter을 이용한 주입 --> <bean id='xml2' class='kr.co.softcampus.beans.TestBean1' lazy-init="true"> <property name="data1" value="300"/> <property name="data2" value="문자열3"/> <property name="data3" ref="data_bean1"/> </bean> <bean id='data_bean1' class='kr.co.softcampus.beans.DataBean1'/> </beans>
-xml에서의 객체 생성후 주입하는 방법-
package kr.co.softcampus.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import kr.co.softcampus.beans.DataBean1; import kr.co.softcampus.beans.TestBean1; @Configuration public class BeanConfigClass { @Bean public TestBean1 java1() { return new TestBean1(100,"문자열2",new DataBean1()); } @Bean public TestBean1 java2() { TestBean1 t1 = new TestBean1(); t1.setData1(300); t1.setData2("문자열3"); t1.setData3(new DataBean1()); return t1; } }
-java 에서 bean객체 생성하는 방법-
package kr.co.softcampus.main; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import kr.co.softcampus.beans.TestBean1; import kr.co.softcampus.config.BeanConfigClass; public class MainClass { public static void main(String[] args) { // TODO Auto-generated method stub //xml ClassPathXmlApplicationContext ctx1 = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml"); /* xml생성자를 이용한 주입 */ System.out.println("xml생성자를 이용한 주입"); TestBean1 xml1 = ctx1.getBean("xml1",TestBean1.class); System.out.println("data1:"+ xml1.getData1()); System.out.println("data2:"+ xml1.getData2()); System.out.println("data3:"+ xml1.getData3()); /* xml setter를 이용한 주입 */ System.out.println("xml setter를 이용한 주입"); TestBean1 xml2 = ctx1.getBean("xml2",TestBean1.class); System.out.println("data1:"+xml2.getData1()); System.out.println("data2:"+xml2.getData2()); System.out.println("data3:"+xml2.getData3()); ctx1.close(); System.out.println("=========="); //java System.out.println("java생성자를 이용한 주입"); AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(BeanConfigClass.class);//BeanConfigClass.class에 셋팅되어져있는 어노테이션들을 확인 @Bean이 있으면 그곳이 bean을 정의한곳 그래서 그 메소드를 자동호출 TestBean1 java1 = ctx2.getBean("java1",TestBean1.class); System.out.println("data1:"+java1.getData1()); System.out.println("data2:"+java1.getData2()); System.out.println("data3:"+java1.getData3()); System.out.println("java set을 이용한 주입"); TestBean1 java2 = ctx2.getBean("java2",TestBean1.class); System.out.println("data1:"+java2.getData1()); System.out.println("data2:"+java2.getData2()); System.out.println("data3:"+java2.getData3()); ctx2.close(); } }
main에서 주소값을 참조변수에 넣어주고 데이터 출력
출력값
xml생성자를 이용한 주입
data1:100
data2:문자열1
data3:kr.co.softcampus.beans.DataBean1@1460a8c0
xml setter를 이용한 주입
data1:300
data2:문자열3
data3:kr.co.softcampus.beans.DataBean1@1460a8c0==========
java생성자를 이용한 주입data1:100
data2:문자열2
data3:kr.co.softcampus.beans.DataBean1@121314f7
java set을 이용한 주입
data1:300
data2:문자열3
data3:kr.co.softcampus.beans.DataBean1@130c12b7자동주입(스프링5.1부터는 직접 설정 방식을 추천함)
@Bean(autowire = 주입방식)자동 주입 방식을 설정한다.
Autowire.By_NAME:이름을 통한 자동 주입
Autowire.By_TYPE:타입을 통한 자동 주입
xml에서의 방법
package kr.co.softcampus.beans; public class DataBean2 { }
DataBean2 클래스
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; } }
TestBean2 클래스
<bean id='data1' class='kr.co.softcampus.beans.DataBean2'/> <bean id='data2' class='kr.co.softcampus.beans.DataBean2'/> <bean id='xml3' class='kr.co.softcampus.beans.TestBean2' lazy-init='true' autowire="byName"/>
-자동주입을 위한 xml 파일-
자동 주입을 위해 DataBean2객체 2개 생성후 autowire을 사용하여 자동으로 주입
ClassPathXmlApplicationContext ctx1 = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml"); TestBean2 xml3 = ctx1.getBean("xml3",TestBean2.class); System.out.println("xml3.data1:"+xml3.getData1()); System.out.println("xml3.data2:"+xml3.getData2());
main class에서 주소값 참조변수에 넣어준후 출력
출력값
xml3.data1:kr.co.softcampus.beans.DataBean2@418e7838
xml3.data2:kr.co.softcampus.beans.DataBean2@61230f6ajava에서의 방법
@Bean public DataBean2 data1() { return new DataBean2(); } @Bean public DataBean2 data2() { return new DataBean2(); } @Bean(autowire = Autowire.BY_NAME) public TestBean2 java3() { return new TestBean2(); }
data1 ,data2 객체를 생성한후 java3객체에서 자동주입 받는방식
TestBean2 java3 = ctx2.getBean("java3",TestBean2.class); System.out.println("data1:"+java3.getData1()); System.out.println("data2:"+java3.getData2());
-main class-
출력값
data1:kr.co.softcampus.beans.DataBean2@65c7a252
data2:kr.co.softcampus.beans.DataBean2@4d154ccd'스프링 프레임워크 기초 공부' 카테고리의 다른 글
12장 AOP (0) 2020.04.30 11장 어노테이션을 이용한 빈 설정 (0) 2020.04.30 9장 DI 자동주입 (0) 2020.04.27 8장 setter 메소드를 통한 주입 (0) 2020.04.27 7장 di 생성자를 이용한 주입 (0) 2020.04.27