Member 가 영화표를 구매 하려고 합니다. 매번 구매하는 영화표는 다른 객체여야 겠죠? Ticket은 prototype으로 하고 Member는 singleton으로 하겠습니다.

티켓 두 개는 달라야 합니다.

   @Test public void singlePrototype(){
       ...
       assertNotSame(ticket1, ticket2);
   }

티켓 두 개는 하나의 멤버가 산거죠.

   @Test public void singlePrototype(){
       ...
       Ticket ticket1 = Member.getTicket();
       Ticket ticket2 = Member.getTicket();
       assertNotSame(ticket1, ticket2);
   }

멤버는 keesun12라는 bean이라고 하면 다음과 같이 테스트 케이스가 만들어집니다.

   @Test public void singlePrototype(){
       Member keesun12 = getMember("keesun12");
       Ticket ticket1 = keesun12.getTicket();
       Ticket ticket2 = keesun12.getTicket();
       assertNotSame(ticket1, ticket2);
   }

그리고 구현을 아래 처럼 합니다.

class Member {
...
    Ticket ticket;
...
    public Ticket getTicket() {
        return ticket;
    }

    public void setTicket(Ticket ticket) {
        this.ticket = ticket;
    }
}

그리고 설정은 아래 처럼 Member는 singleton으로.. TIcket은 prototype으로 했습니다.

    <!-- BeanFactoryAware -->
    <bean id="keesun12" class="beanConfiguration.Member">
        <property name="ticket" ref="ticket1" />
    </bean>

    <bean id="ticket1" class="beanConfiguration.Ticket" scope="prototype"/>

테스트는 당연히 통과 하지 않습니다. 두개의 티켓 객체가 같기 때문이죠. 이걸 해결하려고 다음과 같이 구현한 부분을 수정합니다.
1. ticket 필드를 삭제합니다. setTicket 메소드도 삭제합니다. getTicket은 남겨둬야겠죠.
2. Member 클래스가 BeanFactoryAware 인터페이스를 구현합니다.
3. BeanFactory 타입의 변수 추가합니다.
그럼 다음 처럼 됩니다.

class Member implements BeanFactoryAware {
...
    BeanFactory ticketFactory;
...
    Ticket getTicket(){
       return (Ticket)ticketFactory.getBean("ticket");
    }
...
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
}

설정부분에서 더이상 ticket을 DI를 이용하지 않으므로 더 단순해 졌네요.

    <bean id="keesun12" class="beanConfiguration.Member" />

    <bean id="ticket" class="beanConfiguration.Ticket" scope="prototype" />

이제 테스트는 통과 합니다.