问答详情
源自:4-8 Spring Bean装配之基于Java的容器注解说明——基于泛型的自动装配

看了这节,还是没明白里面的内部逻辑,泛型的注解是怎么用的,有人能讲解下么,还有s1哪个报错,修改为Store后返回的不还是StringStore么?这有什么区别?

@Autowired
private Store<String> s1;
@Autowired
private Store<Integer> s2;
@Bean      
public StringStore stringStore() {
    return new StringStore();  
}
@Bean      
public IntegerStore integerStore() {
    return new IntegerStore();  
}
@Bean(name = "stringStoreTest")
public Store stringStoreTest() {
  System.out.println("s1 : " + s1.getClass().getName());  
  System.out.println("s2 : " + s2.getClass().getName());
  return new StringStore();
}

测试类:

@Test
public void testG() {
    StringStore store = super.getBean("stringStoreTest");
}

有点困惑,不知道这段讲了什么,有人能讲解下么?

尤其是主函数部分的三个@Bean,还有@Autowired,我还是不太明白里面的逻辑

还有S1哪个报错,修改为Store后返回的不还是StringStore么?那么在@Autowired的时候,它是怎么区分的? 

或者说查找的时候是看声明的返回值的类型?那么如果还有一个类实现了Store<String>的,也正好@Bean了,是不是也是无法区分

@Bean
public StringStore stringStore(){
    return new StringStore();  
}
@Bean(name="stringStoreTest")
public Store stringStoreTest(){
    return new StringStore();
}

提问者:未卜先知 2016-12-13 18:52

个回答

  • 慕前端6229441
    2017-09-18 13:54:46

    首先interface  store<T>,泛型接口,

    接下来2个实现类,StringStore和IntegerStore

    ////////////////////////////

    @Bean

    public StringStore stringStore(){  

     return new StringStore(); 

    }

    这里没有指定bean的name,默认是成员方法的名字,即stringStore。spring扫描之后初始化的名为stringStore的bean注册到容器中,此时容器中有一个名为stringStore的bean。

    /////////////////////////////

    @Bean    

     public IntegerStore integerStore() {  

     return new IntegerStore(); 

    }解释同上此时,此时容器中有2个bean,分别为stringStore和integerStore.

    //////////////////////

    @Autowired

    private Store<String> s1;

    @Autowired

    private Store<Integer> s2;

    @Autowired注解是按照类型在容器中搜索相应的bean,s1对应容器中的stringStore,s2对应integerStore。///////////////////////////

    @Bean(name = "stringStoreTest")

    public Store stringStoreTest() { 

    System.out.println("s1 : " + s1.getClass().getName());   

    System.out.println("s2 : " + s2.getClass().getName()); 

    return new StringStore();}

    此时这个方法里面用到的s1,s2就对应不是空了。@bean注解会被扫描初始化生成一个指定名字为stringStoreTest的bean注册到容器中。返回类型是Store时,通过3个@Bean初始化的bean注册到容器中的类型不同,而@Auto wired注解也不会通过类型匹配错误,从而导致s1空指针。当返回类型是StringStore时,容器中会出现2个类型是String Store的bean,@Autowired从容器中通过类型匹配时会出错,不知道是哪一个即bean不唯一,无法匹配,s1为空,即报空指针错误。

    解决办法可以用老师的方法修改返回类型,也可以用@Qualifier指定名字,或者使用@Resource注解。

  • qq_不只是看看_03455689
    2017-04-10 16:04:58

    我这里试的时候,报错会说Store<String>不唯一,然后junit会报null pointer Exception,即使像老师说的那样改了,依旧是一样的结果。。。。

  • qq_幸福客_0
    2017-02-11 18:11:28

    @Bean 注解的方法,在注册bean对象的时候,就是根据方法返回值类型确定其类型的。

    “如果还有一个类实现了Store<String>的,也正好@Bean了,是不是也是无法区分” ,当然了

  • 战神无敌冲
    2016-12-18 21:26:14

    我也没看懂这节课的逻辑,他为什么要讲这节课啊

  • 果不其然
    2016-12-14 10:25:13

    这里主要是讲解了注解方式的依赖注入和泛型注入;

    @Bean 实际上就是 在xml中定义一个bean 就相当于<bean id="xx" class="com.xx.xxx"></bean>

    @Autowired 注解就是注入值  在属性上边使用该注解  就相当于 

    <bean id="xx" class="com.xx.xx">

        <property name="xxx" ref="xxx" />

    </bean>