[TIL] 2020.08.14_TIL

TO_DO

  • [최종프로젝트] 제안서 작성
  • [복습] 스프링 수업복습

스프링 복습

[ beanContainer.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 ">
    
    <!--  Hello hello = new Hello() -->
    <!--  클래스명까지 포함한 path, bean 1개당 1개의 객체가 만들어진다. -->
    <!--  id를 구분자로 사용한다.(내가 정해주기 나름이다) -->                   
	<bean class="basic.Hello" id="hello" lazy-init="true" />
	<bean class="basic.Hello" id="hello2" lazy-init="true" />
	
	<!-- basic.HelloSingle라는 싱글톤 클래스의 getInstance 메소드를 호출해서 빈으로 등록해주는 설정 -->
	<bean class="basic.HelloSingle" id="hs" factory-method="getInstance" />
	<bean class="basic.HelloSingle" id="hs2" factory-method="getInstance" /> 

</beans>

factory-method=”getInstance”

  • 클래스의 static 메소드를 호출해서 인스턴스를 생성하는 방식이다.
  • 팩토리 메소드를 호출해서 빈 오브젝트를 생성해야 한다면 태그에 사용할 수 있는 factory-method 애트리뷰트를 이용하는 것이 편리하다.
  • 전통적인 싱글톤 클래스는 생성자를 직접 호출해서 오브젝트를 만들 수 없다.(private이기 때문에)
  • 생성과 함께 초기화 작업이 필요한 경우라면 static 팩토리 메소드를 이용해야 한다.

[ Hello.java ]

package basic;
public class Hello {
	private String msg;
	
	public Hello() {
		System.out.println("Hello 객체 로딩...");
		msg="Hello";
	}
	
	public void prnMsg() {
		System.out.println("msg : " + msg);
	}
}

[ HelloSingle.java ]

package basic;

public class HelloSingle {
	// 멤버변수를 선언
	private static HelloSingle instance = null;	//전역 객체변수로 사용하기 위해 static으로 생성
	private String msg = "안녕 난 싱글턴이야...";
	
	// HelloSingle 이라는 생성자를 만들어준다.
	// 생성자는 private으로 만들어 접근을 막는다.
	private HelloSingle() {
		System.out.println("HelloSingle 객체 로딩...");
	}
	
	// 객체를 소프트웨어에 실체화 한 것 ‘인스턴스’
	// getInstance 메소드를 통해 한번만 생성된 객체를 가져온다.(싱글톤 패턴)
	public static HelloSingle getInstance() {
		if( instance == null ){		//최초 한번만  new 연산자를 통해 메모리에 할당
			instance = new HelloSingle();
		}
		return instance;
	}
	
	public void prnMsg() {
		System.out.println("msg : " + msg);
	}
}

[ HelloMain.java ]

package basic;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class HelloMain {
	public static void main(String[] args) {
		ApplicationContext context = new GenericXmlApplicationContext("classpath:beanContainer.xml");
		
		HelloSingle obj3 = context.getBean("hs", HelloSingle.class);	//명시적 형변환 없이 사용하는 방법 
		HelloSingle obj4 = (HelloSingle) context.getBean("hs2");	// id가 hs2인 객체를 가져온다.
		obj3.prnMsg();
		System.out.println(obj3);
		System.out.println(obj4);
		
		Hello obj = (Hello)context.getBean("hello");
		obj.prnMsg();
		
		Hello obj2 = (Hello)context.getBean("hello2");
		obj2.prnMsg();
	}
}

1. BeanFactory와 BeanDefinition - 기초

Spring

1.1 BeanFactory

  • GenericXmlApplicationContext의 계층도를 살펴보면, BeanFactory 인터페이스는 인스턴스를 생성, 설정하고 많은 수의 bean을 관리하는 실질적인 컨테이너이다. 즉, 객체 생성과 검색에 대한 기능을 정의한다.
  • 생성된 bean들은 일반적으로 서로 협력하고 그들 사이의 의존성을 가지게 되는데, 그 의존성들은 BeanFactory에 의해 사용된 설정 데이터에 반영된다.
  • 생성된 객체를 검색하는데 필요한 getBean() 메서드가 BeanFactory에 정의되어 있고 객체가 싱글톤/프로토타입 빈인지 여부를 확인하는 기능도 제공한다.
  • XML에 bean을 생성해 놓고 메인에서 GenericXmlApplicationContext로 생성된 bean을 가져온다. GenericXmlApplicationContext 클래스는 XML로부터 정보를 읽어와 객체 생성과 초기화를 수행한다.
  • AnnotationconfigApplicationContext : 자바 어노테이션을 이용한 클래스로부터 객체 설정 정보를 가져온다.
  • GenericGroovyApplicationContext : 그루비 코드를 이용해 설정 정보를 가져온다.

1.2. BeanDefinition

<?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 ">
<beans>
	<bean id="..." class="...">
	...
	</bean>
	<bean id="..." class="...">
	...
	</bean>
	...
</beans>
  • 클래스명 : BeanDefinition 내 작성된 bean의 실질적인 구현 클래스이다. bena이 일반적인 생성자를 사용하는 대신에 정적인 factory메소드를 호출함으로써 생성된다면, 이것은 factory클래스의 클래스명이 될 것이다.
  • bean 설정요소 : bean이 컨테이너 내에서 어떤 행위를 하는지 정의한다. 예를 들어, 프로토타입인지 싱글톤, autwiring 모드, 의존성 체크 모드, 초기화(initialization)와 제거(destruction)메소드 등을 설정할 수 있다.

태그: ,

카테고리:

업데이트:

댓글남기기