[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 - 기초
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)메소드 등을 설정할 수 있다.
댓글남기기