为了账号安全,请及时绑定邮箱和手机立即绑定

看了这节,还是没明白里面的内部逻辑,泛型的注解是怎么用的,有人能讲解下么,还有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();
}

正在回答

5 回答

首先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注解。

12 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~
#1

稻子凡

空指针异常是不是因为你的接口以及接口实现类没有加注解 导致找不导要注入的实现类
2017-09-03 回复 有任何疑惑可以回复我~

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

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信