7.7. 빈 라이프 사이클

이 작업은 요청 수명 동안 빈을 저장하는 방법을 보여줍니다.

주입된 빈의 기본 범위는 @Dependent 입니다. 즉, 빈의 라이프사이클은 참조가 포함된 빈의 라이프사이클에 따라 달라집니다. 다른 여러 범위가 존재하며 고유한 범위를 정의할 수 있습니다. 자세한 내용은 컨텍스트 및 범위를 참조하십시오.

빈 라이프사이클 관리

  1. 빈에 원하는 범위를 주석을 답니다.

    @RequestScoped
    @Named("greeter")
    public class GreeterBean {
      private Welcome welcome;
      private String city; // getter & setter not shown
      @Inject   void init(Welcome welcome) {
        this.welcome = welcome;
      }
      public void welcomeVisitors() {
        System.out.println(welcome.buildPhrase(city));
      }
    }
  2. 이 빈은 Jakarta Server Faces 뷰에서 사용될 때 상태를 유지합니다.

    <h:form>
      <h:inputText value="#{greeter.city}"/>
      <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/>
    </h:form>

빈은 지정한 범위와 관련된 컨텍스트에 저장되며 범위가 적용되는 한 지속됩니다.

7.7.1. 생산자 방법 사용

생산자 메서드 는 빈 인스턴스의 소스 역할을 하는 메서드입니다. 지정된 컨텍스트에 인스턴스가 없으면 메서드 선언 자체에서 빈을 설명하고 컨테이너에서 메서드를 호출하여 빈의 인스턴스를 가져옵니다. 생산자 메서드를 사용하면 애플리케이션에서 빈 인스턴스화 프로세스를 완전히 제어할 수 있습니다.

이 섹션에서는 생산자 메서드를 사용하여 주입을 위해 빈이 아닌 다양한 오브젝트를 생성하는 방법을 보여줍니다.

예제: 생산자 방법 사용

대체 대신 생산자 방법을 사용하면 배포 후 다형성이 허용됩니다.

예제의 @Preferred 주석은 한정자 주석입니다. 한정자에 대한 자세한 내용은 한정자를 참조하십시오.

@SessionScoped
public class Preferences implements Serializable {
   private PaymentStrategyType paymentStrategy;
   ...
   @Produces @Preferred
   public PaymentStrategy getPaymentStrategy() {
       switch (paymentStrategy) {
           case CREDIT_CARD: return new CreditCardPaymentStrategy();
           case CHECK: return new CheckPaymentStrategy();
           default: return null;
       }
   }
}

다음 주입 지점에는 생산자 메서드와 동일한 유형 및 한정자 주석이 있으므로 일반적인 Contexts 및 Dependency Injection 주입 규칙을 사용하여 생산자 메서드로 확인됩니다. 생산자 메서드는 컨테이너에서 호출하여 이 주입 지점에 서비스를 제공할 인스턴스를 가져옵니다.

@Inject @Preferred PaymentStrategy paymentStrategy;

예제: 생산자 메서드에 범위 할당

생산자 메서드의 기본 범위는 @Dependent 입니다. 빈에 범위를 할당하면 적절한 컨텍스트에 바인딩됩니다. 이 예제의 제작자 메서드는 세션당 한 번만 호출됩니다.

@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy() {
   ...
}

예제: 생산자 방법 내에서 주입 사용

애플리케이션에서 직접 인스턴스화된 오브젝트는 종속성 주입을 활용할 수 없으며 인터셉터가 없습니다. 그러나 생산자 메서드에 종속성 주입을 사용하여 빈 인스턴스를 가져올 수 있습니다.

@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy(CreditCardPaymentStrategy ccps,
                                          CheckPaymentStrategy cps ) {
   switch (paymentStrategy) {
      case CREDIT_CARD: return ccps;
      case CHEQUE: return cps;
      default: return null;
   }
}

요청 범위 빈을 세션 범위 생산자에 삽입하는 경우 제작자 메서드는 현재 요청 범위 인스턴스를 세션 범위로 승격합니다. 이 방법은 바람직한 동작이 아니므로 이러한 방식으로 생산자 메서드를 사용할 때는 주의해야 합니다.

참고

생산자 메서드의 범위는 제작자 메서드를 선언하는 빈에서 상속되지 않습니다.

생산자 메서드를 사용하면 빈이 아닌 오브젝트를 주입하고 코드를 동적으로 변경할 수 있습니다.