Spring DI, AOP

4. Bean과 ApplicationContext - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 2. 24. 10:47

1. Bean

  • Spring Container(Application Context) 관리하는 객체
  • Application Context : 객체(Bean) 저장소, Bean을 저장, 관리(생성, 소멸, 연결), Map의 형태로 저장
    • BeanFactory(부모) - Bean(객체)을 생성, 연결 등의 기본 기능을 정의
    • ApplicationContext(자식) - BeanFactory를 확장해서 여러 기능을 추가 정의

 

2. ApplicationContext의 종류 

  • Spring Boot에서는 Java Config를 사용하면 된다.

3.  ApplicationContext의 주요 메서드

 

4. 실습

  • Main 클래스
@ToString
class Car{
    Engine engine;
    Door door;
}
class Engine {}
class Door {}

public class Main {
    public static void main(String[] args) {
        // AC를 생성 - AC의 설정파일은 AppConfig.class 자바설정
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
//        Car car = (Car)ac.getBean("car"); // byName 객체(빈)을 조회
        Car car = ac.getBean("car", Car.class); // 위와 동일
        System.out.println("car = " + car);
        Engine engine = ac.getBean(Engine.class);
        Engine engine2 = ac.getBean(Engine.class);
        Engine engine3 = ac.getBean(Engine.class);
        System.out.println("engine = " + engine);
        System.out.println("engine2 = " + engine2);
        System.out.println("engine3 = " + engine3);
    }
}
  • AppConfig.java - 설정파일
@Configuration
public class AppConfig {
    @Bean
    Car car(){
        return new Car();
    }

    @Bean
    Engine engine(){
        return new Engine();
    }

    @Bean
    Door door(){
        return new Door();
    }
}
  • @Configuration으로 이 파일이 설정파일임을 명시해주고, @Bean으로 Bean객체 등록을 해주었다.

  • Engine의 주소가 동일하게 나오는데, 이는 기본 @Scope 설정이 Singleton이라서 그렇다.
  • @Scope를 prototype으로 바꿔주면...
@Bean
@Scope("prototype")
Engine engine(){
    return new Engine();
}

  • 주소가 다르게 나온다.
// Bean이 몇개나 등록되어있는가
System.out.println("ac.getBeanDefinitionCount() = " + ac.getBeanDefinitionCount());
// 등록된 Bean의 이름
System.out.println("ac.getBeanDefinitionNames() = " + Arrays.toString(ac.getBeanDefinitionNames()));
// engine이라는 BeanDefinition이 있는지
System.out.println("ac.containsBeanDefinition(\"engine\") = " + ac.containsBeanDefinition("engine"));
// Bean 객체 Car의 @Scope가 Singleton인지아닌지
System.out.println("ac.isSingleton(\"car\") = " + ac.isSingleton("car"));
// Bean 객체 Engine의 @Scope가 prototype인지 아닌지
System.out.println("ac.isPrototype(\"engine\") = " + ac.isPrototype("engine"));

  • ac.getBeanDefinitionNames() 

  • Bean으로 등록된 객체들의 이름이 나온다