我正在尝试使用Spring的Autowire,但是如果我没有使用@Bean注释显式定义Bean,则Bean实例化将失败。
这是示例代码:
@Component
public class Bar {
}
@Component
public class Foo {
private final Bar bar;
@Autowired
public Foo(Bar bar) {
this.bar = bar;
}
}
@Configuration
@ComponentScan(basePackages = {"com"})
public class StringTest {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(TestConfig.class);
Foo foo = ctx.getBean(Foo.class);
}
}
@Configuration
public class TestConfig {
@Bean
public Foo foo(Bar bar) {
return new Foo(bar);
}
@Bean
public Bar bar() {
return new Bar();
}
}
这是一个有效的版本,但是如果我注释掉TestConfig类中的bean定义,spring不能实例化Foo,而我得到这个exepiton:
> Exception in thread "main"
> org.springframework.beans.factory.NoSuchBeanDefinitionException: No
> qualifying bean of type 'com.test.Foo' available at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:347)
> at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334)
> at
> org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1107)
> at com.test.StringTest.main(StringTest.java:15)
我要创建的Bean是一个具体的类,所以我认为spring应该可以自动找到它。
我应该始终在配置类中显式定义bean吗?