Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用基于注释的配置代替基于XML的配置_Java_Xml_Spring - Fatal编程技术网

Java 如何使用基于注释的配置代替基于XML的配置

Java 如何使用基于注释的配置代替基于XML的配置,java,xml,spring,Java,Xml,Spring,我通过基于XML的配置将Spring框架应用于依赖项注入 例如,我有3门课: 1. public class Robot implements IRobot{ IHand hand; -//- } 2. public class SonyHand implements IHand{ -//- } 3. public class ToshibaHand implements IHand{ -//- } 此外,我还有XML文件: <

我通过基于XML的配置将Spring框架应用于依赖项注入

例如,我有3门课:

  1. public class Robot implements IRobot{

       IHand hand;

       -//-

     }

  2. public class SonyHand implements IHand{ -//- }

  3. public class ToshibaHand implements IHand{ -//- }
此外,我还有XML文件:

<beans ...>

  <bean id="robot1" class="somepackage.Robot.class">
    <property name="hand" ref="sonyHand">
  </bean>

  <bean id="robot2" class="somepackage.Robot.class">
    <property name="hand" ref="toshibaHand">
  </bean>

  <bean id="sonyHand" class="somepackage.SonyHand.class"/>


  <bean id="toshibaHand" class="somepackage.ToshibaHand.class"/>       

</beans>
<beans ...>

  <context:component-scan base-package="somepackage"/>    

</beans>
稍微改变了课程:

  1. public class Robot implements IRobot{

       @Autowired("sonyH")
       IHand hand;

       -//-

     }

  2. public class SonyHand implements IHand{ -//- }

  3. public class ToshibaHand implements IHand{ -//- }
XML文件中几乎没有任何内容:

<beans ...>

  <bean id="robot1" class="somepackage.Robot.class">
    <property name="hand" ref="sonyHand">
  </bean>

  <bean id="robot2" class="somepackage.Robot.class">
    <property name="hand" ref="toshibaHand">
  </bean>

  <bean id="sonyHand" class="somepackage.SonyHand.class"/>


  <bean id="toshibaHand" class="somepackage.ToshibaHand.class"/>       

</beans>
<beans ...>

  <context:component-scan base-package="somepackage"/>    

</beans>
这一切都是可行的,但这不是我所需要的,因为容器将创建的bean与前面的示例略有不同:

豆子机器人将引入sonyHand Bean

豆子机器人2和一个桑尼汉豆将被引入其中

豆子宝贝

豆豆东芝手


我知道为什么会发生这种情况是因为@autowiredsony,但我不知道如何修复它,使其与基于XML的配置类似。

稍微重构一下您的类

@Configuration
public class AppConfig{

  @Bean
  public Robot robot1(IHand sonyH){
    return new Robot(sonyH);
  }

  @Bean
  public Robot robot2(IHand toshibaH){
    return new Robot(toshibaH);
  }

  @Bean(name = "sonyH")
  public SonyHand sonyHand(){
    return new SonyHand();
  }

  @Bean(name = "toshibaH")
  public ToshibaHand toshibaHand(){
    return new ToshibaHand();
  }
}
现在如果你尝试像这样自动连线

@Autowired
Robot robot1 // this will have sonyH instance

@Autowired
Robot robot2 // this will have toshibaH instance

我很感激你。这就解决了我的问题,最终使我对这个话题的理解更加清晰。很高兴它帮助了我: