Spring 숙련
- Bean 등록하기
1-1. 자바 애너테이션(Java Annotation)을 사용하는 방법
@Component
를 사용하면 @ComponentScan
에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록 해준다.
일반적으로 @Component
를 사용하여 Bean을 자동으로 등록하는 것이 좋다.
@Controller
, @Service
와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하면 개발 생산성에 유리함.1-2. Bean Configuration File에 직접 수동 등록하는 방법
@Configuration
public class HelloConfiguration {
@Bean
public HelloController sampleController() {
return new SampleController;
}
}
-------------
@Configuration
public class PasswordConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Bean
을 설정한다.@Configuration
을 설정한다.
- Bean 수동 등록을 사용하는 순간은?
- 같은 타입의 Bean이 2개라면?
Food food;
필드에 @Autowired
를 사용하여 Bean 객체를 주입려고 시도했지만, food 타입의 객체가 하나 이상 존재하기 때문에 오류가 발생한다.
@Autowired
는 기본적으로 Bean Type
으로 DI를 지원, 이로 연결이 되지않을 경우 Bean Name
으로 찾는다.
3-1. 해결방법
@Autowired
Food pizza;
@Autowired
Food chicken;
@Test
@DisplayName("테스트")
void test1() {
pizza.eat();
chicken.eat();
}
@Primary
애너테이션 사용@Component
@Primary // 애너테이션 선언 - 기본값으로 사용
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
-----------
@Autowired
Food food;
@Test
@DisplayName("테스트")
void test1() {
food.eat();
}
같은 타입의 Bean이 여러개 있더라도 Primary가 붙어있는 Bean 객체 우선 주입한다.
@Qualifier
애너테이션 사용@Component
@Qualifier("pizza") // 애너테이션 선언, 이름 지정
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
-----------
@Autowired
@Qualifier("pizza")
Food food;
@Test
@DisplayName("테스트")
void test1() {
food.eat();
}
}
@Qualifier
와 @Primary
가 동시에 적용되어있다면 @Qualifier
의 우선순위가 더 높다.@Qualifier
는 주입 받고자하는 곳에 애너테이션을 반드시 추가해 주어야 한다.@Primary
를 설정하고 지엽적으로 사용되는 Bean 객체에는 @Qualifier
를 사용하는 것이 좋다.