스프링 설정 파일에서의 루트 엘리먼트는 < bean >.
우리가 만든 모든 클래스를 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="tv" class="polymorphism.SamsungTV" init-method="initMethod" destroy-method="destroyMethod"/>
<!-- 클래스 하나 당 하나의 <bean> 설정이 필요하다.
중요한 것은 class 속성값. 여기에 패키지 경로가 포함된 전체 클래스 경로를 지정해야 한다. -->
</beans>
package polymorphism;
// init-method 속성이 찾아서 부를 애들
public class SamsungTV implements TV {
public void initMethod() {
System.out.println("객체 초기화 작업 처리...");
}
public void destroyMethod() {
System.out.println("객체 삭제 전에 처리할 로직 처리...");
}
// 구동된 컨테이너로부터 SamsungTV 객체를 얻어내 보자.
// SamsungTV 객체가 언제 생성되는지 확인하기 위해서 기본 생성자를 추가
public SamsungTV() {
System.out.println("===> SamsungTV 객체 생성");
}
// 다형성을 활용한 코드(인터페이스 메소드 재정의 필요)
public void powerOn() {
System.out.println("SamsungTV---전원 켠다.");
}
public void powerOff() {
System.out.println("SamsungTV---전원 끈다.");
}
public void volumeUp() {
System.out.println("SamsungTV---소리 올린다.");
}
public void volumeDown() {
System.out.println("SamsungTV---소리 내린다.");
}
}
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 14:09:32 KST 2021]; root of context hierarchy
===> SamsungTV 객체 생성
객체 초화 작업 처리..
SamsungTV---전원 켠다.
SamsungTV---전원 끈다.
SamsungTV---소리 올린다.
SamsungTV---소리 내린다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 14:09:32 KST 2021]; root of context hierarchy
객체 삭제 전에 처리할 로직 처리..
<bean id="tv" class="polymorphism.SamsungTV" init-lazy="true"/>
자세한 것은 여기서
싱글톤 패턴이란
여러 개 생성할 필요 없는 객체들이 있다. 예를 들어 SamsungTV 클래스는 객체들의 가격이 다 다른 것도 아니므로 하나만 생성되어도 된다.
하나의 객체만 생성하도록 제어하는 것이 싱클톤 패턴인데, 일일이 클래스에 패턴 관련 코드를 쓰는 것은 어렵다.
스프링은 이것을 scope 속성을 통해 해결한다.
컨테이너가 생성한 bean을 어느 범위에서 사용할 수 있는 지를 지정할 때 사용하는 것이 scope 속성이다.
<bean id="tv" class="polymorphism.SamsungTV" scope="singleton"/>
스프링 기반의 애플리케이션은 단순한 bean 등록 외에도 트랜잭션 관리 등의 복잡하고 다양한 설정이 필요하다. 이 모든 설정을 하나의 파일로 처리하면 복잡하고 코드가 길어지므로 기능별 여러 XML 파일로 나눠 설정하는 것이 효율적. 이들을 하나로 통합할 때 < import > 엘리먼트를 사용한다.
<beans>
<import resource="context-datasource.xml"/>
<import resourse="context-transaction.xml"/>
</beans>