@Bean
- 개발자가 컨트롤 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶을 때 사용
- 메서드 레벨에 선언하며, 반환되는 객체를 수동으로 빈으로 등록하는 방법
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
...
}
@Configuration
- 해당 클래스에 1개 이상의 @Bean을 포함하고 있음을 명시하는 어노테이션
- @Bean을 사용하는 클래스는 반드시 @Configuration을 지정해주어야 한다.
- @Configuration 어노테이션도 상위에 @Component 어노테이션을 포함하므로 컴포넌트 스캔의 대상이 된다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
...
}
@Component
- 개발자가 직접 컨트롤 가능한 클래스에 사용
- 클래스 레벨에 선언하며, 스프링이 애플리케이션 실행 시점에 컴포넌트 스캔을 통해 자동으로 빈을 찾아 등록하는 방법
@Component
public class MyConverter {
...
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
String value() default "";
}
@ComponentScan
- @Component 어노테이션과 스테레오 타입 어노테이션이 부여된 클래스를 자동으로 스캔하여 빈으로 등록하는 어노테이션
- 해당 어노테이션이 붙은 클래스를 루트로 하여 하위 클래스들을 스캔하면서 빈으로 등록한다. (스프링 부트에서는 @SpringBootApplication 어노테이션에 포함)
@SpringBootApplication
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}
- @SpringBootApplication 어노테이션은 해당 클래스가 스프링 부트를 설정하는 클래스임을 의미하며, 아래 세 어노테이션이 결합한 것
- @SpringBootConfiguration: 현재 클래스를 구성 클래스로 지정한다. (@Configuration 어노테이션의 특화된 형태)
- @EnableAutoConfiguration: 스프링 부트의 자동-구성을 활성화하여, 우리가 필요로 하는 컴포넌트들을 자동으로 구성하도록 스프링 부트에 알려준다.
- @ComponentScan: 컴포넌트 검색을 활성화하여, 스프링이 @Component 어노테이션이 붙은 클래스를 찾아 스프링 애플리케이션 컨텍스트에 컴포넌트로 등록한다.
- 또한, 스프링은 @SpringBootApplication 어노테이션이 달린 클래스가 있는 패키지를 베이스 패키지로 간주한다.
'Spring > Spring' 카테고리의 다른 글
빈 생명주기와 콜백 (0) | 2022.03.03 |
---|---|
의존관계 주입 방법 (0) | 2022.03.03 |
객체지향 설계와 스프링 (0) | 2022.02.28 |
스프링 컨테이너와 컴포넌트 스캔 (0) | 2022.01.20 |
Gradle 스프링 초기 설정 (0) | 2022.01.20 |