본문 바로가기
IT개발/Spring Framework

Spring Container(스프링 컨테이너/프레임워크/백엔드/개발/자바/프로그래밍/java/framework)

by 시간기억자 2024. 12. 4.
반응형
  • MessageObject(인터페이스)
  • HelloMessageObject(클래스)  //  MessagePrintObject(클래스)  // MessagePrintApp(클래스)  //  HiMessageObject(클래스)
  • 03_message.xml

MessageObject(인터페이스)

public interface MessageObject {
	String getMessage();
}

 

 

HelloMessageObject(클래스)

public class HelloMessageObject implements MessageObject {
	@Override
	public String getMessage() {
		return "Hello!!!";
	}
}

 

MessagePrintObject(클래스) >> 관계를 맺기 위해 생성자나 Setter 메소드중 반드시 하나는 있어야 한다.

public class MessagePrintObject {
	//MessageObject 인터페이스를 상속받은 자식클래스의 객체를 저장하기 위한 필드
	//=> 필드에 객체를 저장하기 위해 생성자 또는 Setter 메소드를 작성 - 포함관계(의존관계)로 만들수있다
	//=> 필드에 객체를 저장해야만 필드에 저장된 객체를 참조해 메소드를 호출할 수 있다.
	private MessageObject object;
	
	//필드에 대한 Setter, Getter 생성
	public MessageObject getObject() {
		return object;
	}
	public void setObject(MessageObject object) {
		this.object = object;
	}
	
	public void messagePrint() {
		//필드에 객체가 저장되어 있지 않은 경우 NullPointerException 발생
		String message=object.getMessage();
		System.out.println("message = "+message);
	}	
}

 

MessagePrintApp(클래스)

public class MessagePrintApp {
	public static void main(String[] args) {
		/*
		//HelloMessageObject object=new HelloMessageObject();
		HiMessageObject object=new HiMessageObject();
		MessagePrintObject print=new MessagePrintObject();
		//매개변수에 객체를 전달하여 필드에 저장 - 포함관계(의존관계) 구현
		print.setObject(object);
		print.messagePrint();
		*/
		
		//Spring Container 사용하면 Setter 메소드 만들어서 관계를 구현할 필요가 없다.
		
		//ApplicationContext(인터페이스) 객체 : 스프링 컨테이너(Spring Container) 기능을 제공하기 위한 객체
		//=> Spring Bean Configuration File(XML)을 제공받아 객체(Spring Bean)를 생성하여 관리한다.
		ApplicationContext context=new ClassPathXmlApplicationContext("03_message.xml");
		//ClassPath : 자바가 가져다 쓸 수 있는 Build Path 폴더에서
		//Xml : XML 파일들을 제공받아
		//ApplicationContext 프로그램을 만든다.
		
		MessagePrintObject print=(MessagePrintObject)context.getBean("messagePrintObject");
		print.messagePrint();
		
		//ApplicationContext 객체 제거 - 스프링 컨테이너 소멸
		//=> 스프링 컨테이너가 관리하는 모든 객체(Spring Bean)도 소멸
		//Garbage 콜렉터가 나중에 없애줘서 꼭 할필요는 없지만 그래도 했음.
		((ClassPathXmlApplicationContext)context).close();
		
	}
}

 

HiMessageObject(클래스)

public class HiMessageObject implements MessageObject {
	@Override
	public String getMessage() {
		return "Hi!!!";
	}
}

 

03_message.xml

 

<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 https://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 스프링 컨테이너(Spring Container)는 환경설정파일(Spring Bean Configuration File - XML파일)로부터
	클래스를 제공받아 객체를 생성하여 관리 -->
	<!-- => Spring Bean : 스프링 컨테이너에 의해 관리되는 객체(클래스) -->
	<!-- => 스프링 컨테이너는 클래스를 문자열로 제공받아 리플렉션(Reflection) 기술을 사용해 객체 생성 -->
	
	<!-- bean 엘리먼트를 사용해 스프링 컨테이너에게 클래스를 제공하여 Spring Bean으로 사용되도록 설정 -->
	<bean class="xyz.itwill03.spring.HelloMessageObject" id="helloMessageObject"/>
	<bean class="xyz.itwill03.spring.HiMessageObject" id="hiMessageObject"/>
	
	<!-- bean 엘리먼트의 하위 엘리먼트를 사용하여 Spring Bean에 대한 의존관계 설정 -->
	<bean class="xyz.itwill03.spring.MessagePrintObject" id="messagePrintObject">
		<!-- <property name="object" ref="helloMessageObject"/> -->
		<property name="object" ref="hiMessageObject"/>
	</bean>
</beans>

  • 인터페이스가 필수는 아니지만, 인터페이스가 있어야지 결합도를 낮출 수 있다.

  • ApplicationContext 객체 : 스프링 컨테이너(Spring Container)
  • ApplicationContext context=new ClassPathXmlApplicationContext("03_message.xml");
  • 03_message.xml 파일 만들때 아래와 같이 생성

XML 파일은 아래의 방법으로 생성하면 된다.

 

  • 스프링 컨테이너(Spring Container)는 환경설정파일(Spring Bean Configuration File - XML파일)로부터 클래스를 제공받아 객체를 생성하여 관리
    → Spring Bean : 스프링 컨테이너에 의해 관리되는 객체(클래스)
    → 스프링 컨테이너는 클래스를 문자열로 제공받아 리플렉션(Reflection) 기술을 사용해 객체 생성
  • bean 엘리먼트를 사용해 스프링 컨테이너에게 클래스를 제공하여 Spring Bean으로 사용되도록 설정
  • bean 엘리먼트의 하위 엘리먼트를 사용하여 Spring Bean에 대한 의존관계 설정

  • HelloMessageObject를 HiMessageObject로 바꾸고 싶으면 XML  파일만 고치면 된다.
  • 클래스가 바뀌어도 프로그램을 바꿀 필요 없이 XML 파일만 고치면 되는거다.

 

 

  • new 연산자로 객체를 만들어서 서로 관계를 만들어 놓을경우,
  • 처음 HelloMessageObject 클래스로 프로그램 만든 다음에, 나중에 HiMessageObject 클래스로 바꿀 경우 모두 다 바꿔야 한다
    그 결합도를 낮추기 위한 방법인 것이다.

 

반응형

댓글