본문 바로가기
웹 프로그래밍(풀스택-->java)/웹프로그래밍(백엔드-->java)

59. Java 코드를 활용한 빈 등록

by 백엔드개발자0107 2021. 12. 25.

자 이번시간에는 자바코드를 활용한 빈 등록에 대해서 알아볼 것이다.

 

 

 

 

위 자바코드는 xml 사용방식이고 

두번쨰 자바코드는 자바 사용방식이다.

 

 

--> 주로 xml을 이용하는 것보다는 자바파일 즉 어노테이션을 이용한다. 혼용해서 사용하는 사람들도 많다.

 

MainClass.java

 

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.beans.TestBean2;                                                                      
import kr.co.softcampus.beans.TestBean3;                                                                      
import kr.co.softcampus.beans.TestBean4;                                                                      
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/con
				                                                                                              
				TestBean1 xml1 = ctx1.getBean("xml1" , TestBean1.class);                                      
				System.out.printf("xml1 : %s\n",xml1  );                                                      
                                                                                                              
				TestBean1 xml11 = ctx1.getBean("xml1" , TestBean1.class);                                     
				System.out.printf("xml1 : %s\n",xml11 );                                                      
				                                                                                              
				System.out.println("--------------------------------");                                       
				TestBean2 xml2 = ctx1.getBean("xml2",TestBean2.class);                                        
				System.out.printf("xml2: %s\n",xml2);                                                         
				                                                                                              
				TestBean2 xml22 = ctx1.getBean("xml2",TestBean2.class);                                       
				System.out.printf("xml2: %s\n",xml22);                                                        
				                                                                                              
				System.out.println("------------------------------");                                         
				TestBean3 xml3 = ctx1.getBean("xml3",TestBean3.class);                                        
				System.out.printf("xml3: %s\n",xml3);		                                                  
						                                                                                      
				TestBean3 xml33 = ctx1.getBean("xml3",TestBean3.class);                                       
				System.out.printf("xml3: %s\n",xml33);		                                                  
				//서로 다른 프로토타입으로 인한 다른 객체결괏값이 나온다.                                                             
                                                                                                              
				System.out.println("------------------------------");                                         
				                                                                                              
				TestBean4 t4 = ctx1.getBean(TestBean4.class);                                                 
				System.out.printf("t4: %s\n",t4);                                                             
				                                                                                              
				ctx1.close();                                                                                 
				                                                                                              
				System.out.println("=============================");                                          
				                                                                                              
				//java파일을 사용하는 방식                                                                             
				AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(BeanConfigCla
				                                                                                              
				TestBean1 java1  = ctx2.getBean("java1",TestBean1.class);                                     
				System.out.printf("java1: %s\n",java1);                                                       
				                                                                                              
				ctx2.close();                                                                                 
		                                                                                                      
				TestBean1 java11 = ctx2.getBean("java1",TestBean1.class);                                     
				System.out.printf("java11 : %s\n",java11);                                                    
				                                                                                              
				//TestBean1 java500 = ctx2.getBean("java500",TestBean1.class);                                
				                                                                                              
				TestBean1 java600 = ctx2.getBean("java600",TestBean1.class);                                  
				System.out.printf("java600 : %s\n",java600);                                                  
				                                                                                              
				TestBean2 java2 = ctx2.getBean("java2",TestBean2.class);                                      
				System.out.printf("java2:%s\n",java2);                                                        
				                                                                                              
				TestBean2 java22 = ctx2.getBean("java2",TestBean2.class);                                     
				System.out.printf("java2:%s\n",java22);                                                       
				//같은 객체의 주소값을 받아온다. (singleton이기 떄문이다.)                                                       
				                                                                                              
				TestBean3 java3 = ctx2.getBean("java3",TestBean3.class);                                      
				System.out.printf("java3:%s\n",java3);                                                        
				                                                                                              
				                                                                                              
				TestBean3 java33 = ctx2.getBean("java3",TestBean3.class);                                     
				System.out.printf("java3:%s\n",java33);                                                       
				                                                                                              
				System.out.println("--------------------------");                                             
				TestBean4 java4 =  ctx2.getBean(TestBean4.class);                                             
				System.out.printf("java4 : %s\n",java4);                                                      
				                                                                                              
				ctx2.close();                                                                                 
	}                                                                                                         
                                                                                                              
}

 

 

BeanConfigClass.java

 

package kr.co.softcampus.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import kr.co.softcampus.beans.TestBean1;
import kr.co.softcampus.beans.TestBean2;
import kr.co.softcampus.beans.TestBean3;
import kr.co.softcampus.beans.TestBean4;

@Configuration
public class BeanConfigClass {

	@Bean
	public TestBean1 java1() {
		
		TestBean1 t1 = new TestBean1();
		return t1;
	}
	//이렇게 메서드를 만들어놓고 아무런 작업도하지 않았다.
	//여기서 이 java1메서드의 이름이 빈의 아이디가 된다. 
	
	@Bean(name="java600")
	public TestBean1 java500() {
		
		TestBean1 t1 = new TestBean1();
		return t1;
		//얘는 메소드의 이름이 java500이기때문에 , 이 메소드에서 반환하는 이 빈객체는 java500이라는 이름으로 등록이 된다.
		// 하지만 	@Bean(name="java600") 이렇게 하면 새로운 이름이 등록이 된다. 
		
	}
	
	@Bean
	@Lazy
	public TestBean2 java2() {
		
		TestBean2 t2 = new TestBean2();
		
		return t2;
		//이렇게 하면,
		//  <bean id ="xml2" class="kr.co.softcampus.beans.TestBean2" lazy-init="true"/>
//		 <!-- 자 lazy-init="true"를 넣어주면 xml을 로딩할떄 객체를 생성하는 게 아닌 getBean()메소드를생성할떄, 객체를생성한다.  -->
//		이 코드와 같게 된다.  
	}
	
	@Bean
	@Scope("prototype")
	public TestBean3 java3() {
		
			TestBean3 t3 = new TestBean3();
			return t3;
		
	}
	//getBean을 MainClass에서 getBean 할때마다 계속해서 새로운 객체를 생성한다.
	
	@Bean
	public TestBean4 java4() {
		
		TestBean4 t4 = new TestBean4();
		return t4;
		
	}
	
	@Bean
	@Primary
	public TestBean4 java5() {
		
		TestBean4 t4 = new TestBean4();
		return t4;
		
	}
	//이런식으로 똑같은 타입의 빈 클래스가 정의되어 있을경우 자바 컴파일러는 인식을 하지를 못한다.
	//그래서 이런경우에 클래스타입을 가지고 빈을 가지고 오면 @Primary 어노테이션을 넣으면성공한다.
}

 

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">
	                    
	<bean  id="xml1" class="kr.co.softcampus.beans.TestBean1"/>
	 <!-- 이 bean의 주소값을 가져오기 위해서는 id를 가지고 있어야만 한다.  -->   
	 <bean id ="xml2" class="kr.co.softcampus.beans.TestBean2" lazy-init="true"/>
	 <!-- 자 lazy-init="true"를 넣어주면 xml을 로딩할떄 객체를 생성하는 게 아닌 getBean()메소드를생성할떄, 객체를생성한다.  -->
	 <bean id ="xml3" class="kr.co.softcampus.beans.TestBean3" scope="prototype"/>
	  <bean class="kr.co.softcampus.beans.TestBean4"/>
	  <!-- 만약에 아이디가 없는 빈을 사용하겠다 하면, 클래스파일만 MainClass.java파일에서 지정하면 된다.  -->
 <bean class="kr.co.softcampus.beans.TestBean4" primary="true"/>
<!-- 똑같은클래스의 값이 여러개가 정의되어있다면, primary="true"로 같은클래스중에서 사용할 클래스를 지정한다.  -->
</beans>

 

TestBean1.java

package kr.co.softcampus.beans;

public class TestBean1 {

	public TestBean1() {
		
		System.out.println("TestBean1의 생성");
		
	}
	
	
}

 

TestBean2.java

 

package kr.co.softcampus.beans;

public class TestBean2 {

	public TestBean2() {
		System.out.println("TestBean2의 생성자 ");
		
	}
	
}

 

TestBean3.java

 

package kr.co.softcampus.beans;

public class TestBean3 {
		public TestBean3() {
			
			System.out.println("TestBean3의 생성자 ");
			
		}
}

 

 

TestBean4.java

 

package kr.co.softcampus.beans;

public class TestBean4 {

	public TestBean4() {
		
		System.out.println("TestBean4의 생성자 ");
		
	}
	
}

 

위 코드들 잘 보자.!

'웹 프로그래밍(풀스택-->java) > 웹프로그래밍(백엔드-->java)' 카테고리의 다른 글

61. 주입  (0) 2021.12.26
60. Init,destroy 메서드  (0) 2021.12.25
58. 자동주입  (0) 2021.12.24
57. 컬렉션 주입  (0) 2021.12.22
56. Setter 메서드를 통한 주입  (0) 2021.12.20