ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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@61230f6a

     

     

    java에서의 방법

     

       
        @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
Designed by Tistory.