1

Guice を使用すると、次のことができます。

interface Leg {}

_

class LeftLeg implements Leg {
    public String toString() {
        return "LeftLeg";
    }
}

_

class RightLeg implements Leg {
    public String toString() {
        return "RightLeg";
    }
}

_

class Robot {
    final Leg leftLeg_;
    final Leg rightLeg_;

    @Inject
    Robot(@Named("left") Leg leftLeg, @Named("right") Leg rightLeg) {
        leftLeg_ = leftLeg;
        rightLeg_ = rightLeg;
    }

    public String toString() {
        return "leftLeg_=" + leftLeg_ + ", rightLeg_=" + rightLeg_;
    }
}

_

class RobotTest {
    @Test
    public void t1() throws Exception {
        Injector inj = Guice.createInjector(new AnGuiceModule());
        Robot r = inj.getInstance(Robot.class);
        assertEquals(r.toString(), "leftLeg_=LeftLeg, rightLeg_=RightLeg");
    }
}

_

class AnGuiceModule extends AbstractModule {
    protected void configure() {
        bind(Leg.class).annotatedWith(Names.named("left")).to(LeftLeg.class);
        bind(Leg.class).annotatedWith(Names.named("right")).to(RightLeg.class);
    }
}

XML 構成を使用せずに JSR-330 (オプション) アノテーションと JavaConfig を使用して、Spring 3.x (3.1.x または 3.2) で同じことを達成するにはどうすればよいですか?

4

4 に答える 4

1

interface Leg {}

_

 @Component
 class LeftLeg implements Leg {
  public String toString() {
    return "LeftLeg";
  }
 }

_

@Component
class RightLeg implements Leg {
  public String toString() {
    return "RightLeg";
 }
}

_

class Robot {
  @Autowired
  Leg leftLeg_;
  @Autowired
  Leg rightLeg_;



  public String toString() {
    return "leftLeg_=" + leftLeg_ + ", rightLeg_=" + rightLeg_;
 }
}

_

@RunWith(SpringJUnit4ClassRunner.class)
class RobotTest {
  @Autowired
  Robot r;
  @Test
  public void t1() throws Exception {
     System.out.println(r);
 }
}
于 2012-12-07T04:52:00.110 に答える
1

私が見つけることができる最も近いものは次のとおりです (Robot および Leg* クラスの定義は変更されません):

public class RobotTest {

    @Test
    public void t1() throws Exception {
        ApplicationContext ctx = new 
               AnnotationConfigApplicationContext(RobotConfig.class, Robot.class);
        Robot r = ctx.getBean(Robot.class);
        assertEquals("leftLeg_=LeftLeg, rightLeg_=RightLeg", r.toString());
    }
}

@Configuration
class RobotConfig {

    @Bean
    public Leg leftLeg() {
        return new LeftLeg();
    }

    @Bean
    public Leg rightLeg() {
        return new RightLeg();
    }

}

代替案は次のとおりです。

public class RobotTest {

    @Test public void t1() throws Exception {
        ApplicationContext ctx = new 
               AnnotationConfigApplicationContext(RobotConfig.class);
        Robot r = ctx.getBean(Robot.class);
        assertEquals("leftLeg_=LeftLeg, rightLeg_=RightLeg", r.toString());
    }
}

@Configuration
class RobotConfig {

   @Bean @Scope("prototype") public Robot robot() {
       return new Robot(leftLeg(), rightLeg());
   }

    @Bean @Scope("prototype") public Leg leftLeg() {
        return new LeftLeg();
    }

    @Bean @Scope("prototype") public Leg rightLeg() {
        return new RightLeg();
    }
}
于 2012-12-09T03:16:24.213 に答える
0

spring forumで説明されている興味深いアプローチがあります。どういうわけか子コンテキストへの参照を取得する必要があります。そこに提示されているアプローチは好きではありませんが、他の方法があるはずです。

使用法:

  <bean name="someBean" class="playground.spring.BeanImportFactoryBean">
        <property name="applicationContext" ref="privateCtx"/>
        <property name="importBeanName" value="importBean"/>
    </bean>

FactoryBean コード:

public class BeanImportFactoryBean implements FactoryBean, BeanNameAware {
    transient private final Log log = LogFactory.getLog(this.getClass());

    private String beanName;
    private ApplicationContext applicationContext;
    private String importBeanName;

    public BeanImportFactoryBean() {
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    public void setImportBeanName(String importBeanName) {
        this.importBeanName = importBeanName;
    }

    protected String getUsedBeanName() {
        String returnName;
        if (importBeanName == null) {
            returnName = beanName;
        } else {
            returnName = importBeanName;
        }
        return returnName;
    }

    public Object getObject() throws Exception {
        return this.applicationContext.getBean(getUsedBeanName());
    }

    public Class getObjectType() {
        return this.applicationContext.getType(getUsedBeanName());
    }

    public boolean isSingleton() {
        return this.applicationContext.isSingleton(getUsedBeanName());
    }
}
于 2015-12-04T14:57:03.243 に答える