首页 > 解决方案 > 如何使用带有动态参数的spring DI构造函数

问题描述

任何人都知道如何使用动态参数调用 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);
    }
}

对象构建器类。

@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());
    }
}

标签: javaspringspring-bootdependency-injection

解决方案


@Scope("prototype")意味着 springObjectBuilder在每个依赖项中注入 new ,并且当您调用时applicationContext.getBean("builder")返回 new 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.


推荐阅读