java– 为什么@Autowired(required = false)不适用于@Configuration bean?

java– 为什么@Autowired(required = false)不适用于@Configuration bean?,第1张

概述让我们举个例子说明一下:有这个bean:public class Foo { private String name; Foo(String name) { this.name = name; } public String getName() { return this.name;

让我们举个例子说明一下:

有这个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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1265228.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存