생성자 인수가있는 의존성 주입
-
26-12-2019 - |
문제
다음과 같이 ejb :
public class Bar() {
private String s;
public Bar() {
this.s = "bar";
}
@Inject public Bar(String s) {
this.s = s;
}
}
.
-
arg-constructor 을 다른
Foo
클래스로 사용하여 해당 빈을 어떻게 주입 할 수 있습니까? -
그런 다음 ejb로
Foo
클래스를 정의하여 다른 클래스 (예 : WebServlet)로 di 을 수행하는 것을 목표로 정의합니다.Foo
를 전달하여String
arg-constructor를 내부 의존성 으로 올바르게 설정하여Bar
클래스 인스턴스를 어떻게 삽입 할 수 있습니까? -
위의 포인트를 달성하기 위해
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;
}
}
.