원문 : Chapter 4. Wire dependencies

bean을 묶기 위해서, 간단하게 Java의 문법을 사용할 수 있다.

@Bean(scope = DefaultScopes.SINGLETON)
public Person rod() {
  return new Person("Rod Johnson");
}

@Bean(scope = DefaultScopes.PROTOTYPE)
public Book book() {
  Book book = new Book("Expert One-on-One J2EE Design and Development");
  book.setAuthor(rod());  // rod() method is actually a bean reference !
  return book;
}

위의 예제에서, 책의 저자는 rod 메소드의 반환값을 사용하고 있다. 하지만, book과 rod 모두 @Bean으로 마크된 메소드기 때문에, Spring의 관리하는 bean들을 반환하게 되며, 따라서 컨테이너의 관리 대상이 된다. rod 빈은 싱글톤이고 book 빈은 프로토타입이다. 설정 파일을 만들 때, Spring은 애노테이션 문맥을 알아차리고 rod() 메소드 호출을 'rod'라는 빈 name으로 참조하도록 한다.

이 컨테이너는 매번 book 빈을 요청할 때 마다 똑같은(싱글톤) rod 빈을 참조하고 있는 다른(프로토타입) book 빈을 반환할 것이다.

위의 코드는 아래와 동일하다:

<bean id="rod" class="Person" scope="singleton">
   <constructor-arg>Rod Johnson</constructor-arg>
</bean>

<bean id="book" class="Book" scope="prototype">
   <constructor-arg>Expert One-on-One J2EE Design and Development</constructor-arg>
   <property name="author" ref="rod"/>
</bean>

위의 예제는 가장 흔히 사용하는 scope을 사용하고 있지만, 어떤 타입의 scope이라도 사용할 수 있음을 알아두자.

@Bean (scope = "customer")
public Bag shopingBag() {
  return new Basket();
}

@Bean (scope = "shift")
public Manager shopManager() {
  ...
}