java - 如何使用带有动态参数的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());
}
}
解决方案
@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
.
推荐阅读
- php - 如何将外键值插入表中?
- c# - 在 ac# 自托管 WFC 服务中迁移到 https
- proxy - 如何将部分请求转发到 Clojure 中的另一台服务器?
- java - JAXB - 返回 UI 时 @XMLTransient 字段消失
- android - 使禁用的视图看起来像已启用。安卓
- ruby-on-rails - RoR 和 Postgresql DB:belongs_to 关联有效,但 has_many 无效
- python - 通过更改数据框,一些列被重复
- ruby-on-rails - 如何将集合选择用于隐藏值
- python - 更新有效负载以将 true 更改为 True
- shiny - 闪亮的 DT 编辑保存在错误的列中