복붙노트

[SPRING] 가능한가요? 보조 주사를 봄에하는 방법이 있습니까?

SPRING

가능한가요? 보조 주사를 봄에하는 방법이 있습니까?

Guice 2 또는 3에서는 여기에 설명 된 Assisted / Partial Inject라고합니다. 이를 통해 Guice는 객체에 대한 팩토리 구현 (내 인터페이스 구현)을 합성하고 일부 생성자 인수는 Guice에 의해 주입되며 일부는 컨텍스트에서 제공됩니다.

Spring에서도 같은 일을 할 수 있습니까?

해결법

  1. ==============================

    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. ==============================

    2.AFAIK하실 수 없습니다. Spring에서는 인스턴스 팩토리 메소드를 사용하여 인스턴스화하거나 인스턴스 팩토리 메소드를 사용하여 인스턴스화 할 수 있습니다. 두 번째 옵션을 사용하면 다른 bean의 팩토리로 작동하는 bean myFactoryBean을 정의 할 수 있습니다. constructor-arg (예를 들어,이 블로그의 인스턴스 팩토리 메서드 사용하기 섹션 참조)를 사용하여 구성 인수를 myFactoryBean으로 전달할 수도 있습니다.이 인수는 Guice가 주입 한 인수와 동일한 기능을 제공합니다. 그러나 팩토리 메서드를 호출 할 때 컨텍스트에서 추가 인수를 제공 할 방법을 모른다.

    AFAIK하실 수 없습니다. Spring에서는 인스턴스 팩토리 메소드를 사용하여 인스턴스화하거나 인스턴스 팩토리 메소드를 사용하여 인스턴스화 할 수 있습니다. 두 번째 옵션을 사용하면 다른 bean의 팩토리로 작동하는 bean myFactoryBean을 정의 할 수 있습니다. constructor-arg (예를 들어,이 블로그의 인스턴스 팩토리 메서드 사용하기 섹션 참조)를 사용하여 구성 인수를 myFactoryBean으로 전달할 수도 있습니다.이 인수는 Guice가 주입 한 인수와 동일한 기능을 제공합니다. 그러나 팩토리 메서드를 호출 할 때 컨텍스트에서 추가 인수를 제공 할 방법을 모른다.

  3. from https://stackoverflow.com/questions/6222460/is-it-possible-and-how-to-do-assisted-injection-in-spring by cc-by-sa and MIT license