public class MenuController {
private MenuService menuService;
@Autowired
public MenuController(MenuService menuService) {
this.menuService = menuService;
}
public List<Menu> getMenus() {
return menuService.getMenuList();
}
}
public interface MenuService {
List<Menu> getMenuList();
}
public class MenuServiceStub implements MenuService {
@Override
public List<Menu> getMenuList() {
return List.of(
new Menu(1,"아메리카노",2500),
new Menu(2,"카라멜 마끼아또",4500),
new Menu(3,"바닐라 라떼",4500)
);
}
}
public class CafeClient {
public static void main(String[] args) {
MenuController menuController = new MenuController(new MenuServiceStub());
List<Menu> menuList = menuController.getMenus();
}
}
// CafeClient.java
public class CafeClient {
@Test
public static void main(String[] args) {
GenericApplicationContext context =
new AnnotationConfigApplicationContext(Config.class);
MenuController menuController = context.getBean(MenuController.class);
List<Menu> menuList = menuController.getMenus();
for(Menu a : menuList)
System.out.println(a);
}
}
// MenuController.java
public class MenuController {
private MenuService menuService;
@Autowired
public MenuController(MenuService menuService) {
this.menuService = menuService;
}
public List<Menu> getMenus() {
return menuService.getMenuList();
}
}
// Config.java
@Configuration
@ComponentScan(basePackageClasses = CafeClient.class)
public class Config {
@Bean
public MenuService getMenuService(){
return new MenuServiceStub();
}
@Bean
public MenuController getMenuController(MenuService menuService){
return new MenuController(menuService);
}
}
// MenuServiceStub.java
public class MenuServiceStub implements MenuService {
@Override
public List<Menu> getMenuList() {
return List.of(
new Menu(1,"아메리카노",2500),
new Menu(2,"카라멜 마끼아또",4500),
new Menu(3,"바닐라 라떼",4500)
);
}
}
// Menu.java
@Getter
@AllArgsConstructor
@ToString
public class Menu {
private long id;
private String name;
private Integer price;
}
Spring Framework의 영역인 Config 클래스에서 MenuController 객체 생성을 정의 해 두었고 이 객체를 Spring의 도움을 받아 CafeClient 에 사용할수 있게 제공하게 된다.
즉 의존성 주입을 Spring에서 대신 해주는 것이다.
스프링 컨테이너는 @Configuration클래스를 자동으로 빈 등록을 하고 클래스를 파싱해서 @Bean이 있는 메소드를 찾아 빈을 생성한다.
@Configuration은 수동으로 등록한 Bean이 생성시 싱글톤을 보장해준다.
그렇게 생성된 빈은 CafeClient 클래스에서 getBean 메소드에 의해 호출된다.