未卜先知
2016-12-13 18:52
@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(); }
首先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注解。
我这里试的时候,报错会说Store<String>不唯一,然后junit会报null pointer Exception,即使像老师说的那样改了,依旧是一样的结果。。。。
@Bean 注解的方法,在注册bean对象的时候,就是根据方法返回值类型确定其类型的。
“如果还有一个类实现了Store<String>的,也正好@Bean了,是不是也是无法区分” ,当然了
我也没看懂这节课的逻辑,他为什么要讲这节课啊
这里主要是讲解了注解方式的依赖注入和泛型注入;
@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>
Spring入门篇
268787 学习 · 963 问题
相似问题