문제

다음과 같이 ejb :

public class Bar() {

     private String s;

     public Bar() {
         this.s = "bar";
     }

     @Inject public Bar(String s) {
         this.s = s;
     }

}
.

  1. arg-constructor 을 다른 Foo 클래스로 사용하여 해당 빈을 어떻게 주입 할 수 있습니까?

  2. 그런 다음 ejb로 Foo 클래스를 정의하여 다른 클래스 (예 : WebServlet)로 di 을 수행하는 것을 목표로 정의합니다.Foo를 전달하여 String arg-constructor를 내부 의존성 으로 올바르게 설정하여 Bar 클래스 인스턴스를 어떻게 삽입 할 수 있습니까?

  3. 위의 포인트를 달성하기 위해 Bar를 정의하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

주석이 달린 생성자 인젝션은 CDI를 알려줍니다. 누군가가 주입되는 막대 인스턴스를 요청할 때마다 @Inject로 표시된 생성자를 사용해야합니다.

CDI 컨테이너는 필요한 모든 생성자 매개 변수에 대한 인스턴스를 가져 와서 "문자열"을 처리 할 수 없으므로 실패합니다.그것은 단지 당신이 의미하는 문자열을 모릅니다.

생산자와 한정자를 사용하여 원하는 문자열을 알려주는 컨테이너가 의존성을 해결하는 데 도움이되어야합니다.나는 단지 가장 단순한 가능한 해결책을 제공합니다 :

public class Bar {

 @Inject 
 public Bar(@Named("myString") String s) {
     this.s = s;
 }
}
.

및 다른 클래스 (다른 클래스 일 필요는 없지만 훨씬 더 읽을 수 없지만) :

public class MyStringProducer {
  @Produces
  @Named("myString")
  public String getMyString() {
    return ...; // whatever you want ... read JSON, parse properties, randomize ...
  }
}
.

다른 팁

@Inject는 "managed"객체를 주입 할 때만 작동합니다.문자열은 관리되는 객체가 아닙니다. 따라서 이것은 Worl입니다.

그러나 다음 예제는 작동해야합니다 (여기에서 봄을 사용했습니다. 사용중인 라이브러리에 따라 DI Initializaton 코드 사용) :

@Named
public class Foo {

    @Inject
    Bar bar;

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext("com.pkg1");
        Foo foo = (Foo)ctx.getBean("foo");

        System.out.println(foo.bar.getString());

    }


}

@Named
public class Bar {
    private String s;
    public Bar() {
        this.s = "bar";
    }
   @Inject 
   public Bar(Bar1 bar1) {
        this.s = bar1.getS();
    }
    public String getString() {
        return s;
    }
}

@Named
class Bar1 {
    private String s="bar1";
    public String getS() {
        return s;
    }
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top