2017-12-27 580 views
0

我通过基于XML的配置将Spring框架用于依赖注入。如何使用基于注解的配置来代替基于XML的配置

例如,我有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> 

因此,春天的IoC(容器)将创建四个豆(对象)中所有。

Bean robot1(将引入一个sonyHand bean)。

Bean robot2(将引入一个toshibaHand bean)。

豆sonyHand。

豆toshibaHand。

问题是,我可以做纯粹基于注释的配置完全相同的东西吗?如果我这样做,那么如何?我已经试过这样:

@Configuration 
public class AppConfig{ 

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

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

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

    @Bean 
    @Qualifier("toshibaH") 
    public ToshibaHand toshibaHand(){ 
    return new ToshibaHand(); 
    } 
} 

轻微改变类:

1. public class Robot implements IRobot{ 

     @Autowired("sonyH") 
     IHand hand; 

     -//- 

    } 

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

    3. public class ToshibaHand implements IHand{ -//- } 

这里几乎一无所有的XML文件中:

<beans ...> 

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

</beans> 

这一切工作,但这不是我需要什么,因为容器创建的豆将与前面的示例稍有不同:

Bean机器人1(将引入sonyHand bean)。

Bean机器人2(同样会引入sonyHand bean)。

豆sonyHand。

豆toshibaHand。

我知道为什么会发生这种情况(因为@Autowired(“sonyH”)),但我不知道如何解决它的问题,就像使用基于XML的配置一样。

回答

1

稍微重构类

@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 
+0

我很感激你。这解决了我的问题,并最终使我对这个主题的理解变得清晰。 –

+0

很高兴帮助:) – pvpkiran

相关问题