ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext를 스프링 컨테이너라 한다.
이렇게 생성된 컨테이너는 등록된 자바 객체를 관리한다.
이때 자바 객체를 스프링은 Bean이라고 부른다.
이를 통해 객체간의 의존도와 결합도를 낮추고 높은 캡슐화를 제공한다.
앞서 살펴봤다시피 스프링 빈은 자바 객체이며
스프링 컨테이너에 의해 관리되는 재사용이 가능한 컴포넌트이다.
@Bean을 통해 메소드로부터 반환되는 객체를 스프링 빈으로 등록할 수 있다.
스프링 빈은 간단하게 다음과 같은 라이프사이클을 가진다.
객체 생성 -> 의존관계 주입
스프링 빈은 객체가 생성되고 의존관계가 주입된 이후부터 데이터를 사용할 준비를 마친다.
즉 초기화 작업은 이러한 DI 작업이 완료된 이후에나 호출해야한다.
이러한 호출 시점을 스프링 컨테이너가 알려준다.
스프링 빈의 이벤트 라이프사이클은 다음과 같다.
스프링은 의존관계가 주입되면 스프링 빈에게 콜백 메서드를 통해
초기화 시점을 알려준다.
이를 @PostConstruct
, @PreDestroy
를 통해 간편하게 초기화와 종료를 실행할 수 있다.
💡 이러한 어노테이션 방식은 순수 자바 기술이라는 장점이 있지만 외부 라이브러리에는 사용할 수 없다는 단점이 있다.
외부 라이브러리에서 초기화, 소멸전 콜백을 사용해야한다면
@Bean
의initMethod
와destoryMethod
를 사용하자