[Spring] ApplicationContext

유진·2025년 2월 27일

Spring

목록 보기
5/11

Application Context란?

Application Context는 객체 컨테이너라고도 한다.
스프링에서 빈을 관리하는 컨테이너이다.
스프링에서는 객체를 직접 생성하는 대신 객체 컨테이너를 사용하여 객체(Bean)을 자동으로 관리하고 주입한다.

Application Context의 역할

1. 객체(Bean) 생성 및 관리

스프링에서 사용되는 빈을 생성하고, 필요한 곳에 자동으로 제공하는 역할을 한다.

2. 설정 파일 기반으로 객체를 동적으로 생성

XML 파일, Java Config, Annotation 등을 이용해 객체를 생성하고 설정할 수 있다.

3. 의존성 주입 지원

서로 의존하는 객체를 new 없이 자동으로 연결해 준다.

사용방법

ApplicationContext ac = new ClassPathXmlApplicationContext("config.xml");

Car car = (Car)ac.getBean("car");
Engine engine = (Engine)ac.getBean("engine");

ApplicationContext가 config.xml을 읽고 car와 engine객체를 자동으로 생성한다.
ac.getBean("car")을 호출하면 미리 생성된 Car객체를 가져온다.

예제

class Car{}
class SportsCar extends Car{}
class Truck extends Car{}
class Engine{}
class AppContext{
    Map map;  //맵 생성 

    AppContext(){   //생성자 
        map = new HashMap();  //맵을 해시맵으로 생성 
        map.put("car",new SportsCar());  //맵에 객체를 넣음 
        map.put("engine",new Engine());  
    }

    Object getBean(String key){   //key에 따른 객체를 리턴
    return map.get(key);
    }
}

public class Main2 {
    public static void main(String[] args) throws Exception {
        AppContext ac = new AppContext();  //AppContext 객체 생성 
        Car car = (Car)ac.getBean("car");   //생성한 객체 ac의 getBean함수 호출 
        System.out.println("car: "+car);
        Engine engine = (Engine)ac.getBean("engine");
        System.out.println("engine: "+engine);
    }
}

위 코드는 만들 객체를 수정할 때마다 코드도 함께 수정해줘야 한다.
-> 유지보수에 좋지 않음
아래 코드처럼 작성해야 유지보수에도 용이하다.

class Car{}
class SportsCar extends Car{}
class Truck extends Car{}
class Engine{}
class AppContext{
    Map map;

    AppContext(){  //생성자 
        try {
            Properties p = new Properties();
            p.load(new FileReader("config.txt"));

            //properties에 있는 내용을 맵에 저장
            map=new HashMap(p);

            //반복문으로 map에 있는 key의 이름을 얻어서 객체를 생성하고 다시 맵에 저장
            for(Object key : map.keySet()){
                Class clazz = Class.forName((String)map.get(key));
                map.put(key,clazz.newInstance());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    Object getBean(String key){
    return map.get(key);
    }
}

public class Main2 {
    public static void main(String[] args) throws Exception {
        AppContext ac = new AppContext();
        Car car = (Car)ac.getBean("car");
        System.out.println("car: "+car);
        Engine engine = (Engine)ac.getBean("engine");
        System.out.println("engine: "+engine);
    }
}

Map은 <String, Object>
Properties는 <String, String>
1. Properties를 선언(p)한다.
2. config.txt파일을 읽어오고, 그 내용을 Map에 저장한다. (<String, String>)
3. for문을 돌며 현재 맵에 있는 모든 value를 객체로 변환한다.
getBean()은 이렇게 만든 map에서 key값에 맞는 객체를 찾아 반환하는 함수이다.

관련 메서드

빈관련 메서드

  • int getBeanDefinitionCount(): 등록된 빈의 개수 반환
  • String[] getBeanDefinitionNames(): 등록된 빈의 이름 목록 반환
  • Object getBean(): 빈 조회

빈 존재 여부 확인 메서드

  • boolean containsBean(String name): 해당 이름의 빈이 존재하는지
  • boolean containsBeanDefinition(String beanName): 특정 이름의 빈 정의가 등록 되어있는지
  • boolean containsLocalBean(String name): 현재 ac에서 해당 빈이 직접 정의 되었는지 확인, 부모 컨텍스트에서 가져온 빈이 아니라 현재 컨텍스트에서만 존재하는지 여부 검사

빈 타입 관련 메서드

  • Class getType(String name): 특정 이름의 빈 타입 반환
  • Map getBeanOfType(class<T> type): 특정 타입의 모든 빈을 조회해 맵형태로 반환
  • boolean isProtoType(String name): 특정 이름의 빈이 프로토타입 범위인지
  • boolean isSingleton(String name): 특정 이름의 빈이 싱글톤 범위인지
  • boolean isTypeMatch(String name, Class<T> typeToMatch): 주어진 빈이 특정 타입과 일치하는지

빈 메타데이터 관련 메서드

  • Annotaion findAnnotationOnBean(String name, Class annotationtype): 특정 빈에 특정 어노테이션이 적용되어있는지 확인 후 해당 어노테이션 반환
  • String[] getAliases(String name): 특정 빈의 별칭 목록 반환
  • String[] getBeanNamesForAnnotation(Class annotationType): 특정 어노테이션이 적용된 빈의 목록 반환
  • String[] getBeanNamesForType(): 특정 타입의 빈의 목록 반환

0개의 댓글