스프링 컨테이너(Spring Container)

  • Bean들의 생명주기(Life Cycle)를 관리한다. 즉, Bean 생성, 관리, 제거 등의 역할을 한다.
  • 자바 객체를 사용하기 위해서 기존에는 new 생성자가 필요했다. 그러나 이 방법은 객체들 간에 서로에 대한 의존성이 높기 때문에 좋은 객체 지향 프로그래밍의 원칙을 지키지 못한다. 좋은 객체 지향 프로그래밍의 원칙을 지키기 위해 Spring이 등장했는데, 이때 객체 간의 의존성을 낮추기 위해 스프링 컨테이너가 사용된다.
  • 즉, 스프링 컨테이너를 사용하면 객체 간의 의존성을 낮춰 좋은 객체 지향 설계를 할 수 있다.
  • 스프링 컨테이너는 ApplicationContext라는 컨테이너로 빈을 제어하고 관리한다.
  • ApplicationContext는 인터페이스로, 구현체가 여러 개 있다.

 


ApplicationContext

ApplicationContext는 다른 인터페이스들을 다중 상속하고 있다.

상속 인터페이스 설명
MessageSource 다국어 메시지 처리 기능 제공
EnvironmentCapable 프로파일 기능, 프로퍼티 기능들 제공
BeanFactory 스프링 빈을 관리하고 조회하는 역할
ApplicationEventPublisher 이벤트 기반의 프로그래밍을 할 때 필요한 기능 제공
ResourceLoader 리소스를 읽어오는 기능 제공

 

ApplicationContext는 다중 상속하고 있는 기능들을 다 가지고 있다. 즉, BeanFactory 기능을 모두 상속하여 Bean 객체를 관리하는 것에 더하여 메시지 처리, 리소스, 이벤트와 관련된 기능까지 추가적으로 가지고 있는 인터페이스이다.

 


ApplicationContext의 구현 클래스

ApplicationContext 사용법

ApplicationContext context = new 구현 클래스(xml 파일명 or java class)

 

ApplicationContext 구현 클래스 3가지

접근 방식 구현 클래스 설명
파일시스템
접근 방식
(xml로 설정)
FileSystemXmlApplicationContext 파일 경로로 지정된 곳의 xml 파일을 읽어 설정 정보를 로딩
ClassPathXmlApplicationContext Classpath에 위치한 xml 파일을 읽어 설정 정보를 로딩
어노테이션
접근 방식
(자바로 설정)
AnnotationConfigApplicationContext @Configuration 어노테이션이 붙은 클래스를 이용하여 설정 정보를 로딩

 


스프링 컨테이너(Spring Container) 사용법

순서
  1. ApplicationContext의 구현체인 FileSystemXmlApplicationContext, ClassPathXmlApplicationContext, AnnotationConfigApplicationContext 중 하나를 이용해서 스프링 컨테이너를 생성한다.
  2. getBean 메서드를 이용하여 스프링 컨테이너에 등록된 빈을 사용한다.

 

1) FileSystemXmlApplicationContext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package ex04;
 
public class HelloSpringApp {
 
    public static void main(String[] args) {
        //스프링 컨테이너를 통해 필요한 객체를 찾아보자.
        
        //1. 스프링 컨테이너 생성
        String resource = "src/main/java/ex04/appContext.xml";
        ApplicationContext ctx = new FileSystemXmlApplicationContext(resource);//스프링 컨테이너
                
        //2. 스프링 컨테이너에 등록된 빈을 사용
        //mb1을 찾아서 sayHello()와 sayHi() 호출
        MessageBean mb1 = ctx.getBean("mb1", MessageBean.class);//강제 형변환
        //MessageBean mb1 = (MessageBean)ctx.getBean("mb1"); 과 동일
        mb1.sayHello();
        mb1.sayHi("BTS""뉴진스""르세라핌");
        
        //mb2를 찾아서 sayHello()와 sayHi() 호출
        MessageBean mb2 = ctx.getBean("mb2", MessageBean.class);//강제 형변환
        mb2.sayHello();
        mb2.sayHi("빅뱅""소녀시대""원더걸스");
        
        //mb3를 찾아서 sayHello()와 sayHi() 호출
        MessageBean mb3 = ctx.getBean("mb3", MessageBean.class);//강제 형변환
        mb3.sayHello();
        mb3.sayHi("김라라""최라라""이라라");
    }
 
}
cs

 

2)  ClassPathXmlApplicationContext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package ex05;
 
public class HelloSpringEx05 {
 
    public static void main(String[] args) {
        
        //1. 스프링 컨테이너 생성
        String resource = "classpath:ex05/emp.xml";
        //classpath: class파일이 있는 경로
        //(C:\multicampus\Spring-workspace\Spring01_IOC\target\classes)
        ApplicationContext ctx = new ClassPathXmlApplicationContext(resource);
        
        //2. 스프링 컨테이너에 등록된 빈을 사용
        Emp e = ctx.getBean("e2", Emp.class); //형변환
        e.info1();
        System.out.println("-------------------");
        ctx.getBean("e3", Emp.class).info2();
        System.out.println("-------------------");
        ctx.getBean("e4", Emp.class).info3();
        
    }
 
}
cs

 

3) AnnotationConfigApplicationContext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package ex06;
 
public class HelloAppEx06 {
 
    public static void main(String[] args) {
        
        //1. 스프링 컨테이너 생성
        ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
        //Config.java: @Configuration 어노테이션이 붙은 클래스
        
        //2. 스프링 컨테이너에 등록된 빈을 사용
        Emp e1 = ctx.getBean("e1", Emp.class);
        System.out.println(e1.getName() + "/" + e1.getDept() + "/" + e1.getSal());
        
        Emp e2 = ctx.getBean("empInfo2", Emp.class);
        System.out.println(e2.getName() + "/" + e2.getDept() + "/" + e2.getSal());
        System.out.println("***************************");
        
    }
 
}
cs

+ Recent posts