让我们举个例子说明一下:
有这个bean:
public class Foo { private String name; Foo(String name) { this.name = name; } public String getname() { return this.name; }}
而这项服务:
public class FooService { private Foo foo; FooService(Foo foo) { this.foo = foo; } Foo getFoo() { return this.foo; }}
鉴于以下Spring配置:
@Configurationpublic class SpringContext {// @Bean// Foo foo() {// return new Foo("foo");// } @Bean @autowired(required = false) FooService fooService(Foo foo) { if (foo == null) { return new FooService(new Foo("foo")); } return new FooService(foo); }}
为了完整起见,这是一个简单的单元测试:
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = {SpringContext.class})public class SpringAppTests { @autowired private FooService fooService; @Test public voID testGetname() { Assert.assertEquals("foo",fooService.getFoo().getname()); }}
然后加载上下文将抛出NoSuchBeanDeFinitionException(Foo).
任何人都可以在这个例子中看到任何错误/缺失,或者为我提供理由吗?
谢谢!基督教
最佳答案除了其他答案:问题是spring在注入参数时没有考虑required = false.见ConstructorResolver
return this.beanfactory.resolveDependency( new DependencyDescriptor(param,true),beanname,autowiredBeannames,typeConverter);
第二个参数总是如此:
public DependencyDescriptor(MethodParameter methodParameter,boolean required)
编辑:Spring使用ConstructorResolver
>“真正的”构造注入
@autowired(required=false) // required=false WILL NOT WORKpublic FooService(Foo foo){ ...}
>工厂方法
@Bean@autowired(required=false) // required=false WILL NOT WORKFooService fooService(Foo foo) { if (foo == null) { return new FooService(new Foo("foo")); } return new FooService(foo);}
因此,在这两种情况下都会忽略必需的属性.
总结以上是内存溢出为你收集整理的java – 为什么@Autowired(required = false)不适用于@Configuration bean?全部内容,希望文章能够帮你解决java – 为什么@Autowired(required = false)不适用于@Configuration bean?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)