반응형
1. 컴포넌트 스캔과 자동 의존관계 설정
컴포넌트 스캔의 원리
@Component 어노테이션이 선언되어 있으면 스프링 빈으로 자동 등록
- @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문! (@Controller 어노테이션을 살펴보면 @Component가 선언된 것을 볼 수 있음)
- @Service, @Repository도 마찬가지로 @Component가 선언되어 있어 스프링 빈으로 자동 등록 된다.
예시
- OrderController.java
@Controller
public class OrderController {
private final OrderService orderService;
@Autowired
public OrderController(OrderService orderService) {
this.orderService = orderService;
}
}
- OrderService.java
@Service
public class OrderService {
private final OrderRepository orderRepository;
@Autowired
public OrderService(OrderRepository orderRepository) {
orderRepository = orderRepository;
}
}
생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 객체 생성 시점에 해당 빈을 찾아서 주입한다. 생성자가 하나만 있으면 생략 가능! -> 이렇게 객체의 의존 관계를 외부에서 넣어주는 것을 DI라고 한다!
참고 : @Autowired 를 통한 DI는 @Controller , @Service 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.
- OrderRepository.java
@Repository
public class OrderRepository {}
이렇게 설정하면 OrderController - > OrderService -> OrderRepository구조로 스프링 컨테이너에 스프링 빈으로 등록된다.
2. 자바 코드로 직접 스프링 빈 등록하기
OrderService.java와 OrderRepository.java의 @Service, @Repository, @Autowired 어노테이션을 제거한다. (OrderController.java는 유지)
예시
- OrderConfig.java
@Configuration
public class OrderConfig {
@Bean
public OrderService orderService() {
return new OrderService(orderRepository());
}
@Bean
public OrderRepository orderRepository() {
return new OrderRepository();
}
}
@Configuration 어노테이션이 선언된 클래스를 생성하고, 스프링 빈으로 등록하고자 하는 메소드에 @Bean 어노테이션을 추가하면, 스프링 빈으로 등록된다.
3. XML로 설정
application.xml에 bean을 직접 등록할 수 있으나 최근에는 거의 사용하지 않는다.
하지만 아직 많은 레거시 프로젝트가 XML로 되어 있기도 하고, 컴파일 없이 빈 설정 정보를 변경할 수 있다는 장점이 있다.
<beans ...>
<bean id="orderService" class="com.test.order.OrderService">
<constructor-arg name="orderRepository" ref="orderRepository"/>
</bean>
<bean id="orderRepository" class="com.test.order.OrderRepository">
</bean>
</beans>
728x90
반응형
'개발 > Web' 카테고리의 다른 글
[Web] 동기 방식과 비동기 방식의 차이점 (3) | 2022.05.04 |
---|---|
[Spring Framework] CORS 적용하기 - @CrossOrigin, <mvc:cors>, Filter (0) | 2022.03.11 |
[Web] Received fatal alert: handshake_failure 에러 (0) | 2022.03.08 |
[Web] Restful API란? (1) | 2022.02.21 |
[Spring] Bean 등록 방법 : @Bean vs @Component 차이 (0) | 2022.02.03 |
댓글