Index
@Configuration
public class AppConfigurer {
@Bean
public Menu menu() {
return new Menu(productRepository());
}
@Bean
public ProductRepository productRepository() {
return new ProductRepository();
}
// (1) 스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfigurer.class);
// (2) 빈 조회
ProductRepository productRepository = applicationContext.getBean("productRepository", ProductRepository.class);
Menu menu = applicationContext.getBean("menu", Menu.class);
Cart cart = applicationContext.getBean("cart", Cart.class);
Order order = applicationContext.getBean("order", Order.class);
// (3) 의존성 주입
OrderApp orderApp = new OrderApp(
productRepository,
menu,
cart,
order
);
// (4) 프로그램 실행
orderApp.start();
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration // Configurer클래스에 붙혀서 해당 기능 사용
@ComponentScan // 스캔의 시작지점 따라서 Configurer 클래스를 프로젝트 최상단에 두는것이 일반적 / @ComponentScan(basePackages = “”) ""를 변경해 범위를 따로 지정할 수 있다.
public class TestConfigurer {
}
: 스프링 컨테이너가 해당 클래스의 인스턴스를 생성하여 스프링 빈으로 관리
@Component
public class Order {
private Cart cart;
private Discount discount;
@Autowired
public Order(Cart cart, Discount discount) {
this.cart = cart;
this.discount = discount;
}
...
}
:@Autowired 애너테이션을 통해 스프링이 관리하고 있는 해당 타입의 객체가 자동으로 주입되어 의존 관계가 완성
public class AppConfigurer {
private Cart cart = new Cart(productRepository(), menu());
public Cart cart() {
return cart;
}
--- 생략 ---
}
public class AppConfigurer {
public ProductRepository productRepository() {
return new ProductRepository();
}
public Menu menu() {
return new Menu(productRepository().getAllProducts());
}
...
}
Configurer 클래스를 통해 의존성을 주입받고 해당 객체를 사용할때 마다 새로운 객체를 생성해서 return
-싱글톤 패턴을 이용하면 객체를 매번 새롭게 생성하지 않고 하나의 객체를 공유하여 메모리 낭비를 줄일 수 있다. 하지만 이러한 장점에도 반드시 필요한 상황에만 사용해야 하는데 이는 객체간의 의존도(결합도)가 높아지기 때문이다.
스프링 프레임워크는 자동으로 DI를 할때 기본적으로 싱글톤 패턴으로 구현된다. 스프링 컨테이너는 내부적으로 객체들을 싱글톤으로 관리하고 싱글톤 레리스트리 기능을 수행한다.(CGLIB 라이브러리 사용)
이를 통해 싱글톤 패턴이 가지는 메모리의 낭비가 적음을 이용하면서 동시에 객체간의 의존도(결합도)를 느슨하게 유지할 수 있다.
스프링의 Bean객체들의 관리 범위는 @Scope(Prototype/Session/ Request) 등의 @Scope 어노테이션을 추가해 변경할 수 있다.