이전에 Spring Bean Configuration File이나, @Configuration
애너테이션을 통해서 Bean 객체를 만드는 방법을 소개했었다.
이번엔 그렇게 생성된 Bean을 가지고오는 방법을 소개해보겠다.
@Inject
- 타입(Class)이 일치하는 Bean을 가지고 오는 애너테이션(Annotaion)이다.
- 동일 타입이 여러 개 있는 경우
@Qualifier
를 이용해서 Bean을 식별한다.- 오직 타입(class)만 확인하며, 동일 타입이 다수 발견되면 @Qualifier를 통해 이름을(id)을 구분.
@Resource
- 이름(id)이 일치하는 Bean을 가지고 오는 애너테이션(Annotaion)이다.
@Autowired
- 타입(class)이 일치하는 Bean을 가지고 오는 애너테이션(Annotaion)이다.
- 동일 타입이 여러개 있는 경우 자동으로
@Qualifier
를 이용해서 Bean을 식별한다.- 실무에서 주로 사용된다.
이 중에 @Autowired
를 가장 많이 사용한다고 하니 소개해보겠다.
AutoWired를 사용하는 이유 : @Inject
+ @Qualifier
- Autowired는 class를 통해 객체를 찾는다.
- root-content.xml 에서는 Board 객체가 2개가 있기 때문에, 타입(class)를 통해 찾는것은 실패로 돌린다. (plan A)
- 그럼 이제 (plan B) 단계로 들어서서 id(변수명)를 가져오게 된다. (그래서 아래 Autowired에서 변수명을 board1이 아닌 b1으로 바꾸게되면 찾지못하여 오류가 뜬다.)
- root-context.xml에 bean을 추가한다.
ex)
<bean id="service" class="com.gdu.app05.service.MemberServiceImpl" />
id에는 타입을, class에는 class를 명시한다(자동완성 가능).
- Java Class로 Spring Bean Configration을 만들어서 전달한다.
ex)
@Configuration
public class SpringBeanConfig {
@Bean
public BoardService boardService() {
return new BoardServiceImpl();
}
}
위와 아래는 같은 역할을 하는 코드이다.
@Autowired
를 추가한다. (필드가 10개면 @Autowired도 10번 작성)@Autowired
private Board board;
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
System.out.println(board.getBoardNo());
System.out.println(board.getTitle());
System.out.println(board.getCreateDate());
}
private Board board;
public MyController(Board board) { // 매개변수 Board board로 타입이 Board인 Bean을 Container에서 가져와라.
super();
this.board = board;
}
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
System.out.println(board.getBoardNo());
System.out.println(board.getTitle());
System.out.println(board.getCreateDate());
}
@Autowired
를 작성해야 한다.
private Board board;
// setter만 생성
@Autowired // 일반 메소드는 @Autowired를 반드시 작성해야 한다.
public void 메소드이름은상관이없다(Board board) { // 매개변수 Board board로 Board 타입의 Bean이 Container에서
this.board = board;
}
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
System.out.println(board.getBoardNo());
System.out.println(board.getTitle());
System.out.println(board.getCreateDate());
}
@Autowired
private Board board1;
@Autowired
private Board board2;
// 요청을 만들어 확인
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
System.out.println(board1.getBoardNo());
System.out.println(board1.getTitle());
System.out.println(board1.getCreateDate());
System.out.println(board2.getBoardNo());
System.out.println(board2.getTitle());
System.out.println(board2.getCreateDate());
}
private Board b1;
private Board b2;
public MyController(Board board1, Board board2) { // 매개변수명이 Bean의 이름(id)과 일치하므로 자동으로 주입된다.
b1 = board1;
b2 = board2;
}
// 요청을 만들어 확인
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
System.out.println(b1.getBoardNo());
System.out.println(b1.getTitle());
System.out.println(b1.getCreateDate());
System.out.println(b2.getBoardNo());
System.out.println(b2.getTitle());
System.out.println(b2.getCreateDate());
}
private Board b1;
private Board b2;
// 2개의 메소드로 나눠 Bean 가져오기
@Autowired
public void setB1(Board board1) {
this.b1 = board1;
}
@Autowired
public void setB2(Board board2) {
this.b2 = board2;
}
// 1개의 메소드로 통합하여 가져오기
@Autowired
public void setBoard(Board board1, Board board2) {
this.b1 = board1;
this.b2 = board2;
}
// 요청을 만들어 확인
@GetMapping("board/detail") // @GetMapping("/board/detail")
public void boardDetail() {
System.out.println(b1.getBoardNo());
System.out.println(b1.getTitle());
System.out.println(b1.getCreateDate());
System.out.println(b2.getBoardNo());
System.out.println(b2.getTitle());![](https://velog.velcdn.com/images/duck-ach/post/83ad58ef-6a8f-402d-82f3-7983db4dc252/image.png)
System.out.println(b2.getCreateDate());
}
1개의 메소드로 통합하여 가져오는 것이 훨씬 깔끔하고 코드도 단순한 것 같다.