[데브코스] Bean 생성에 대해서
Updated: Categories: TILW3D3 - Component Scan / Auto Wired / Bean Scope 를 공부해보자
Streotype Annotation
@Configuration
: App Context(IoC 컨테이너)로 등록하기@Bean
: 컴포넌트 객체(의존성주입을 위한)를 직접 등록하고 싶을때 사용
Component
- 컴포넌트 어노테이션엔 다양한 종류가 존재한다.
- 어노테이션을 달아놓은 파일을 컴포넌트라고 칭한다
@ComponentScan
: 컴포넌트들을 모두 스캔하여 Bean으로 등록한다. 스캔 범위 지정이 가능@ComponentScan(basePackages = {"패키지명", ...}
@ComponentScan(basePackageClasses = {클래스, ...})
@Service
,@Repository
… 등등 계층구조로 역할을 나눠 명시한다
Auto Wired
- 스프링의 ComponentScan 사용시 Bean을 직접 지정하지 않는다.
- 따라서 @Bean으로 직접 의존관계 주입해주던 방식을 자동화해주는 Auto Wired 기능이 등장.
- 컴포넌트로 등록된 파일 내의 메소드에
@Autowired
어노테이션을 붙여준다.- 초기화시 필요한 모든 의존관계가 형성됨
- 잘못된 패턴을 찾을 수 있도록 도와줌
- 테스트를 쉽게 해줌
- 불변성을 확보
@Autowired
생략시 생성자에 자동으로 어노테이션이 붙는다.- 만약 생성자와 관련된 Bean이 두개 이상이라면? => 해당 Bean에 어노테이션을 달아줘야함.
@Primary
: 가장 우선이 되는 Bean을 뜻함@Qualifier("별명")
: Bean 파일에서 별명 설정 후, 생성자에서 명시해줘야함
Bean Scope
- 총 6개의 Bean Scope가 존재함
singleton
,prototype
,request
,session
,application
,websocket
- 기본적으로 싱글톤 스코프를 가진다.
- 싱글톤으로 생성된 Bean을 객체로 가져오면 모두 같은 주소를 가진다
- 다른 주소를 가지게하려면 prototype 스코프로 변경해야함
Scope 변경하기
- 컴포넌트 파일 정의시 어노테이션을 통해 스코프를 정의할 수 있다
@Scope(value = ConfigurableBeanFactory.스코프문자열)
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Bean Life Cycle
- AppContext(IoC 컨테이너) 등록시 연관된 Bean들이 생성된다.
- AppContext는
.close()
메소드로 종료할 수 있으며, 종료시 내부의 모든 Bean들이 소멸된다. - Bean의 생성과 소멸시에 콜백함수를 설정할 수 있다.
Bean 생성 콜백
- @PostConstruct 어노테이션이 적용된 메소드 호출
- Bean이 InitializingBean 인터페이스 구현시 afterPropertiesSet 호출
- @Bean 어노테이션의 initMethod에 설정한 메소드 호출
Bean 소멸 콜백
- @PreDestroy 어노테이션이 적용된 메소드 호출
- Bean이 DisposableBean 인터페이스 구현시 destroy 호출
- @Bean 어노테이션의 destroyMethod에 설정한 메소드 호출