반응형
- 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 클래스로 바꿀 경우 모두 다 바꿔야 한다
그 결합도를 낮추기 위한 방법인 것이다.
반응형
'IT개발 > Spring Framework' 카테고리의 다른 글
Spring MVC에서 컨트롤러 메소드의 매개변수 타입 (0) | 2025.01.17 |
---|---|
카카오맵 api 사용 에러 해결 : Uncaught ReferenceError: kakao is not defined (0) | 2024.12.21 |
Spring IoC(Inversion of Control) - 제어의 역행(스프링/프레임워크/백엔드/개발/프로그래밍) (2) | 2024.12.04 |
Spring Framework란?(스프링 프레임워크/자바/백엔드개발) (0) | 2024.12.03 |
Spring BeanFactory, ApplicationContext, Bean 엘리먼트 속성(Spring/Java/Bean/backend/스프링 빈/자바/스프링/백엔드) (0) | 2024.11.08 |
댓글