스프링 프로토타입 빈 스코프
Spring2011. 2. 8. 11:49
작년에는 스프링을 알고 썼다면, 올해는 이해하고 쓸 수 있도록 하자!!
화이팅!!
봄싹에서 메일 보내는 서비스 클래스 코드를 보면
new 해서 메일을 보내는 것을 확인할 수 있다.
이번에 메일 템플릿을 사용해서 메일을 보낼려고 하는데
이렇게 사용하면, 빈들을 DI 받아서 쓸 수가 없기 때문에 이 클래스를 프로토타입 빈 으로 만들어서 쓰기로 결정.
이 프로토타입 빈을 사용하는 서비스 빈에서는 DI 받아서 사용하지 말고(DI는 빈이 처음 생성될 때 한번만 진행되기 때문에,
프로토타입빈을 매번 똑같은것을 사용하게 됨) DL 받아서 사용하는 방식으로 하자.
기존의 코드(모임에 의견이 달리면 메일을 보내게 되어 있다.)
여기서 저기 new 하는 부분이 메일 템플릿을 생성하는 것이고, 실제 메일을 보내는것은 commentNotiService가 하게 된다.
여기서 문제점은 CommentMailMessage가 bean이 아니기 때문에,
CommentMailMessage에서 사용할 velocityEngine(벨로시티로 메일보낼때 사용) bean을 주입 받을 수 없다.
뭐 생성자에 추가해서 넘겨주면 되긴 하지만, 사실 저렇게 쓰는거 보다야 Prototype Bean을 만들어서 쓰는것이 좀 더 스프링 답다고 할까?
이 Prototype Bean과 이것을 사용하는 방법은 토비의 스프링3에 보면 잘 나와있다.
여기서는 책에 설명되어 있는것 중에서 Provider<T>를 사용하는 방법으로 bean을 생성해서 사용해 보도록 하자.
결론을 보자면..아래와 같이 되겠다.
CommentMailMessage를 빈으로 등록 해주는 것을 잊지 말고, get()해서 사용!!
화이팅!!
봄싹에서 메일 보내는 서비스 클래스 코드를 보면
new 해서 메일을 보내는 것을 확인할 수 있다.
이번에 메일 템플릿을 사용해서 메일을 보낼려고 하는데
이렇게 사용하면, 빈들을 DI 받아서 쓸 수가 없기 때문에 이 클래스를 프로토타입 빈 으로 만들어서 쓰기로 결정.
이 프로토타입 빈을 사용하는 서비스 빈에서는 DI 받아서 사용하지 말고(DI는 빈이 처음 생성될 때 한번만 진행되기 때문에,
프로토타입빈을 매번 똑같은것을 사용하게 됨) DL 받아서 사용하는 방식으로 하자.
기존의 코드(모임에 의견이 달리면 메일을 보내게 되어 있다.)
public void notifyCommentAdded(Meeting meeting, Comment comment) {
Iterator<Attendance> Iter = meeting.getAttendances().iterator();
Collection<Member> members = new ArrayList<Member>();
while (Iter.hasNext()) members.add(((Attendance) Iter.next()).getMember());
commentNotiService.sendMessage( new CommentMailMessage( comment, meeting, null, members));
}
Iterator<Attendance> Iter = meeting.getAttendances().iterator();
Collection<Member> members = new ArrayList<Member>();
while (Iter.hasNext()) members.add(((Attendance) Iter.next()).getMember());
commentNotiService.sendMessage( new CommentMailMessage( comment, meeting, null, members));
}
여기서 저기 new 하는 부분이 메일 템플릿을 생성하는 것이고, 실제 메일을 보내는것은 commentNotiService가 하게 된다.
여기서 문제점은 CommentMailMessage가 bean이 아니기 때문에,
CommentMailMessage에서 사용할 velocityEngine(벨로시티로 메일보낼때 사용) bean을 주입 받을 수 없다.
뭐 생성자에 추가해서 넘겨주면 되긴 하지만, 사실 저렇게 쓰는거 보다야 Prototype Bean을 만들어서 쓰는것이 좀 더 스프링 답다고 할까?
이 Prototype Bean과 이것을 사용하는 방법은 토비의 스프링3에 보면 잘 나와있다.
여기서는 책에 설명되어 있는것 중에서 Provider<T>를 사용하는 방법으로 bean을 생성해서 사용해 보도록 하자.
결론을 보자면..아래와 같이 되겠다.
@Inject Provider<CommentMailMessage> commentMail;
public void notifyCommentAdded(Meeting meeting, Comment comment) {
Iterator<Attendance> Iter = meeting.getAttendances().iterator();
Collection<Member> members = new ArrayList<Member>();
while (Iter.hasNext()) members.add(((Attendance) Iter.next()).getMember());
CommentMailMessage mail = commentMail.get();
mail.setDatas(comment, meeting, null, members);
commentNotiService.sendMessage( mail);
}
public void notifyCommentAdded(Meeting meeting, Comment comment) {
Iterator<Attendance> Iter = meeting.getAttendances().iterator();
Collection<Member> members = new ArrayList<Member>();
while (Iter.hasNext()) members.add(((Attendance) Iter.next()).getMember());
CommentMailMessage mail = commentMail.get();
mail.setDatas(comment, meeting, null, members);
commentNotiService.sendMessage( mail);
}
CommentMailMessage를 빈으로 등록 해주는 것을 잊지 말고, get()해서 사용!!