Как использовать конструктор Spring DI с динамическими параметрами - PullRequest
0 голосов
/ 06 ноября 2019

Кто-нибудь знает, как вызывать бины с динамическими параметрами? Я боролся с этим методом и застрял. Пожалуйста, помогите.

Так вот в чем проблема, я вызываю конструктор через @autowired в StoreService, но сборщик всегда возвращает эту ошибку

Неудовлетворенная зависимость, выраженная через параметр конструктора 0;Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего компонента типа 'java.lang.String': ожидается как минимум 1 компонент, который считается кандидатом на автоматическое подключение. Аннотации зависимостей: {}

Я знаю, что проблема в том, что параметры в конструкторе установлены неправильно, и я не представляю, как определить параметры в конструкторе для выполнения DI. Я уже пробовал разные способы, но все равно получаю ту же ошибку.

Это код, который я сделал.

Класс Config для запуска 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());
    }
}

1 Ответ

2 голосов
/ 06 ноября 2019

@Scope("prototype") означает, что пружина вводит новый 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.

...