@Component
를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록 해준다.
일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋다.
Bean 수동 등록은 언제 사용될까?
@Configuration
public class PasswordConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Bean으로 등록하고자 하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정한다.
Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration을 설정한다.
Spring 서버가 뜰 때 Spring IoC 컨테이너에 Bean으로 저장된다.
// 1. @Bean 설정된 메서드 호출
PasswordEncoder passwordEncoder = passwordConfig.passwordEncoder();
// 2. Spring IoC 컨테이너에 빈 (passwordEncoder) 저장
// passwordEncoder -> Spring IoC 컨테이너
public PasswordEncoder passwordEncoder() {..} → passwordEncoder
@SpringBootTest
public class BeanTest {
@Autowired
Food pizza;
@Autowired
Food chicken;
}
@Component
@Primary
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
@SpringBootTest
public class BeanTest {
@Autowired
Food food;
}
@Component
@Qualifier("pizza")
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
@SpringBootTest
public class BeanTest {
@Autowired
@Qualifier("pizza")
Food food;
}
같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어 있다면 Qualifier의 우선순위가 더 높다.
같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary를 설정하고 지역적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋다.