[SPRING] 가능한가요? 보조 주사를 봄에하는 방법이 있습니까?
SPRING가능한가요? 보조 주사를 봄에하는 방법이 있습니까?
Guice 2 또는 3에서는 여기에 설명 된 Assisted / Partial Inject라고합니다. 이를 통해 Guice는 객체에 대한 팩토리 구현 (내 인터페이스 구현)을 합성하고 일부 생성자 인수는 Guice에 의해 주입되며 일부는 컨텍스트에서 제공됩니다.
Spring에서도 같은 일을 할 수 있습니까?
해결법
-
==============================
1.다음은 내가 요구 한 것과 정확히 일치한다. 그것은 공장의 구현을 합성하지는 않지만, 공장이 건설 중에 다른 콩 (주입 가능한 인공물)을 사용할 수 있도록 주입 컨텍스트에 대한 액세스가 충분하기 때문에 충분합니다. 그것은 XML 대신 @Configuration을 기반으로 자바를 사용하지만 XML에서도 작동합니다.
다음은 내가 요구 한 것과 정확히 일치한다. 그것은 공장의 구현을 합성하지는 않지만, 공장이 건설 중에 다른 콩 (주입 가능한 인공물)을 사용할 수 있도록 주입 컨텍스트에 대한 액세스가 충분하기 때문에 충분합니다. 그것은 XML 대신 @Configuration을 기반으로 자바를 사용하지만 XML에서도 작동합니다.
팩토리 인터페이스 :
public interface Robot { } // Implementation of this is to be injected by the IoC in the Robot instances public interface Brain { String think(); } public class RobotImpl implements Robot { private final String name_; private final Brain brain_; @Inject public RobotImpl(String name, Brain brain) { name_ = name; brain_ = brain; } public String toString() { return "RobotImpl [name_=" + name_ + "] thinks about " + brain_.think(); } } public class RobotBrain implements Brain { public String think() { return "an idea"; } }
// The assisted factory type public interface RobotFactory { Robot newRobot(String name); }
// 이것은 보조 분사를하는 방법을 보여주는 스프링 설정이다.
@Configuration class RobotConfig { @Bean @Scope(SCOPE_PROTOTYPE) public RobotFactory robotFactory() { return new RobotFactory() { @Override public Robot newRobot(String name) { return new RobotImpl(name, r2dxBrain()); } }; } @Bean @Scope(SCOPE_PROTOTYPE) public Brain r2dxBrain() { return new RobotBrain(); } }
테스트 코드 :
public class RobotTest { @Test public void t1() throws Exception { ApplicationContext ctx = new AnnotationConfigApplicationContext(RobotConfig.class); RobotFactory rf = ctx.getBean(RobotFactory.class); assertThat(rf.newRobot("R2D2").toString(), equalTo("RobotImpl [name_=R2D2] thins about an idea")); } }
이것은 Guice가하는 일을 정확히 달성합니다. 까다로운 차이점은 범위입니다. Spring의 기본 범위는 Singleton이고 Guice는 그렇지 않습니다 (프로토 타입).
-
==============================
2.AFAIK하실 수 없습니다. Spring에서는 인스턴스 팩토리 메소드를 사용하여 인스턴스화하거나 인스턴스 팩토리 메소드를 사용하여 인스턴스화 할 수 있습니다. 두 번째 옵션을 사용하면 다른 bean의 팩토리로 작동하는 bean myFactoryBean을 정의 할 수 있습니다. constructor-arg (예를 들어,이 블로그의 인스턴스 팩토리 메서드 사용하기 섹션 참조)를 사용하여 구성 인수를 myFactoryBean으로 전달할 수도 있습니다.이 인수는 Guice가 주입 한 인수와 동일한 기능을 제공합니다. 그러나 팩토리 메서드를 호출 할 때 컨텍스트에서 추가 인수를 제공 할 방법을 모른다.
AFAIK하실 수 없습니다. Spring에서는 인스턴스 팩토리 메소드를 사용하여 인스턴스화하거나 인스턴스 팩토리 메소드를 사용하여 인스턴스화 할 수 있습니다. 두 번째 옵션을 사용하면 다른 bean의 팩토리로 작동하는 bean myFactoryBean을 정의 할 수 있습니다. constructor-arg (예를 들어,이 블로그의 인스턴스 팩토리 메서드 사용하기 섹션 참조)를 사용하여 구성 인수를 myFactoryBean으로 전달할 수도 있습니다.이 인수는 Guice가 주입 한 인수와 동일한 기능을 제공합니다. 그러나 팩토리 메서드를 호출 할 때 컨텍스트에서 추가 인수를 제공 할 방법을 모른다.
from https://stackoverflow.com/questions/6222460/is-it-possible-and-how-to-do-assisted-injection-in-spring by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring의 @Configurable이 때때로 작동하고 때로는 그렇지 않은 이유는 무엇입니까? (0) | 2019.04.05 |
---|---|
[SPRING] 봄 + JPA + MVC - 빈 생성 오류 (0) | 2019.04.05 |
[SPRING] 스프링 부트 응용 프로그램에 사용자 정의 ApplicationContextInitializer를 추가하는 방법은 무엇입니까? (0) | 2019.04.05 |
[SPRING] Spring 애플리케이션을 종료하면 데이터 소스의 JNDI 이름이 JDBC 컨텍스트에서 사라집니다. (0) | 2019.04.05 |
[SPRING] spring-oauth2 로그인 성공 처리기 (0) | 2019.04.05 |