, new
는 new
완전히 DI 시스템을 인하 이후 RequestProcessor
이 @Inject
-annotated 필드를 채울 수 없습니다 보내고. 그래서 당신은 그것을 가지고 할 수있는 방법이 필요하다. RequestProcessor
는 DI가 제공하는 의존성 (phoneService
) 및 프로그래밍 (socket
)를 제공 하나를 원하기 때문에
당신의 목표는 특히 비 - 사소한 보인다. 일반적으로 DI를 사용하면 가능한 한 두 가지를 혼합하지 말 것을 권장합니다. DI를 사용하면 바이러스처럼 퍼지기를 원합니다. 그렇게 하죠. (거의) 모든 것이 주입되도록 시스템을 설계 할 수 있다면 은 정말 멋지다!
귀하의 상황은 완벽하게 실현 가능합니다.
잠재적 인 주사 부위에 어떤 방법이있는 것처럼 보입니다. 이는 기본적 것이다,
public class SomeClass {
@Inject
private PhoneService phoneService;
private void someMethod() {
ExecutorService pool = Executors.newCachedThreadPool();
ServerSocket server = new ServerSocket(25000);
Socket client = server.accept();
pool.execute(new RequestProcessor(client, phoneService));
}
}
아니면 RequestProcessor
인스턴스를 생성하는 공장을 사용할 수 있습니다 :이 알 수없는 클래스는 CDI에 의해 만들어진 사실에 해당 클래스로 PhoneService
를 @Inject
수 있으며, 다음 RequestProcessor
생성자에 전달된다고 가정 결국 같은 효과가있다.
public class RequestProcessorFactory {
@Inject
private PhoneService phoneService;
public RequestProcessor createNewProcessor(Socket socket) {
return new RequestProcessor(socket, phoneService);
}
}
다음 클래스에 그 공장의 인스턴스를 주입 : 당신은 꽤 친숙 할 것입니다 손으로이 공장 쓸 수 있습니다 당신이 그것을 할 수있는 세 번째 방법있다
을
public class SomeClass {
@Inject
private RequestProcessorFactory requestProcessorFactory;
private void someMethod() {
ExecutorService pool = Executors.newCachedThreadPool();
ServerSocket server = new ServerSocket(25000);
Socket client = server.accept();
pool.execute(requestProcessorFactory.createNewProcessor(client));
}
}
, 어떤 Guice's assisted injection.과 유사합니다. 인터페이스를 제공하면 효과적으로 해당 팩토리 구현이 생성됩니다. 내 지식으로는 CDI가 이것을 지원하지 않지만 at least one CDI extension which does이 있습니다.
해피 DIING!
개체를 '새로 만들 때'DI 마법이 자동으로 발생하지 않습니다. 객체 그래프는 DI 시스템에 의해 생성되어야합니다. –
@MattBall, 내가 이것을 알고있는 이유는 내가 이것을하는 방법을 묻고 있는데, 왜냐하면 나 자신을 인스턴스화하는 것이 효과가 없을 것이기 때문이다. –