2016-07-11 4 views
0

EJB enpoint에 주입 된 @TransactionScoped 빈을 가지고 있습니다. 예를 들어 내가 EJB를 호출 할 때. JAX-RS 엔드 포인트에서 두 개의 빈 인스턴스가 생성 된 것을 볼 수 있습니다. 관심이 없는데 왜이 첫 번째 빈 인스턴스가 만들어 질지 궁금하다. 그것은 payara와 wildfly에서 일어나고 있습니다.두 개의 CDI @TransactionScoped Bean 인스턴스가 생성되었습니다. 왜?

@TransactionScoped 
public class TransactionBean implements Serializable { 
    private String data; 
    private static AtomicInteger counter = new AtomicInteger(); 

    public TransactionBean() { 
     this.data = "TransactionBean #" + counter.getAndIncrement() + " created."; 
     System.out.println("Created " + this.data); 

    } 

    public String toString() { 
     return data; 
    } 
} 

내가 만든 출력

  • TransactionBean # 0을 참조하십시오.
  • 트랜잭션 빈 # 1이 생성되었습니다.

# 1 인스턴스는 실제 트랜잭션에서 사용되는 하나의 인스턴스입니다. 이 첫 번째 인스턴스가 만들어지는 이유는 무엇입니까? 특정 응용 프로그램 서버에서 CDI의 구현 세부 사항입니까, 아니면 의도적으로 발생하고 있습니까? 그것은 ... 단지 호기심

건배, 당신은 증인이 대부분 프록시 객체의 생성 무엇 다니엘

+0

아마도 프록시 생성을 목격하고있을 것입니다. 자세한 내용은 [this] (http://stackoverflow.com/questions/18911646/constructor-of-cdi-managed-bean-is-invoked-twice-while-opening-the-page/18911939#18911939)를 참조하십시오. –

+0

생성자가 아닌'@ PostConstruct' 메소드를 모니터링하는 것이 더 낫습니다. –

+0

감사! 이 링크는 매우 유용합니다. 따라서 본질적으로 이것은 구현 - 프록시 작성 방법에 대한 세부 사항 때문입니다. 또한 @PostConstruct의 힌트가 적합합니다. – 38leinad

답변

0

입니다.

CDI (Wildfly 내부를 변경하지 않은 경우 귀하의 경우 Weld)는 기본 개체 자체와 사용자의 주입 지점으로 전달할 프록시를 만듭니다.

이 아이디어를 확인하려면 @Singleton bean을 사용할 위치와 유사한 코드를 사용해보십시오. 생성자는 @Singleton does not create a proxy object과 같이 한 번만 호출해야합니다.

관련 문제