【问题标题】:How to use spring DI constructor with dynamic parameters如何使用带有动态参数的spring DI构造函数
【发布时间】:2020-03-03 00:46:44
【问题描述】:

有谁知道如何使用动态参数调用 bean?我一直在用这种方法挣扎并陷入困境。请帮忙。

所以问题来了,我在 StoreService 中通过 @autowired 调用了构建器,但是构建器总是返回这个错误

通过构造函数参数0表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“java.lang.String”类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释:{}

我知道这个问题是因为构造函数的参数设置不正确,我不知道如何定义构造函数的参数来执行 DI。我已经尝试了不同的方法,但仍然得到同样的错误。

这是我做的代码。

配置类来启动 bean。

@Configuration
public class BuilderConfig {

    @Bean
    @Scope("prototype")
    public ObjectBuilder builder(final String title, final String filename, final String text) {
        return new ObjectBuilder(title, filename, text);
    }
}

ObjectBuilder 类。

@Component
public class ObjectBuilder {

    private String title;

    @Autowired(required = false)
    public ObjectBuilder(final String title, final String filename, final String text) {
        this.title= title;
        this.build(filename, text);
    }

    public void build(String filename, String text) {
        // build data
    } 

    public void publish() {
       // to publish data
    }
}

调用构建器类的类。

@service
public class StoreServiceImpl implements StoreService {

    @Autowired
    private ObjectBuilder builder;

    public void save(final String title, final String filename, final String text) {
       this.save(builder.publish());
    }
}

【问题讨论】:

  • ÒbjectBuilder 中删除@Component。这也不起作用,因为每次在 save 方法中需要它时,您都需要获取 ObjectBuilder。为什么这种复杂性而不仅仅是自己创建一个新实例。使用new没有任何问题。

标签: java spring spring-boot dependency-injection


【解决方案1】:

@Scope("prototype") 表示 spring 在每个依赖项中注入新的ObjectBuilder,当您调用applicationContext.getBean("builder") 时返回新的ObjectBuilder。当您通过以下方式定义 bean 时:

@Bean
@Scope("prototype")
public ObjectBuilder builder(final String title, final String filename, final String text) {...
}

Spring 期望标题、文件名、文本是 bean。所以你不能使用:

@Autowired
private ObjectBuilder builder;

我建议你创建一个工厂并在StoreServiceImpl中使用它:

ObjectBuilderFactory.java:

@Component
public class ObjectBuilderFactory {
    public ObjectBuilder create(final String title, final String filename, final String text) {
        return new ObjectBuilder(title, filename, text);
    }
}

SoreServiceImpl.java:

@Service
public class StoreServiceImpl {

    @Autowired
    private ObjectBuilderFactory builderFactory;

    public void save(final String title, final String filename, final String text) {
        ObjectBuilder builder = builderFactory.create(title, filename, text);
        builder.publish();
    }
}

ObjectBuilder.java:

public class ObjectBuilder {

    private String title;

    public ObjectBuilder(final String title, final String filename, final String text) {
        this.title= title;
        this.build(filename, text);
    }

    public void build(String filename, String text) {
        // build data
    }

    public void publish() {
        // to publish data
    }
}

在这种情况下,您可以删除BuilderConfig.java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2018-04-04
    • 2021-04-05
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多