Spring bean定义和注入
我刚刚开始学习spring。我读了一些如下代码。但我不明白 ResultBuilderFactory 如何返回正确的类。有人可以解释一下吗?谢谢!
public interface ResultBuilder{
public void print();
}
@Component
public class DefaultResultBuilder implement ResultBuilder{
public void print(){System.out.printlin("DefaultResultBuilder"};
}
@Component
public class HtmlResultBuilder implement ResultBuilder{
public void print(){System.out.printlin("HtmlResultBuilder"};
}
@Component
public class ResultBuilderFactory{
private final ResultBuilder defaultResultBuilder;
private final ResultBuilder htmlResultBuilder;
public ResultBuilder get(String name){
if(name.equal("HTML") return htmlResultBuilder;
return defaultResultBuilder;
}
更新:
只需更新组件注释的拼写错误。我的错...我尝试了代码,并收到错误:“ResultBuilderFactory 需要一个 bean,但找到了 2 个...考虑将其中一个 bean 标记为 @Primary,...或使用 @Qualifer...”如果不使用 Primary 或 @Qualifier,原始代码如何工作
I just start learning spring. I read some codes like below. But I don't understand how ResultBuilderFactory can return the correct class. Can somebody please explain? Thanks!
public interface ResultBuilder{
public void print();
}
@Component
public class DefaultResultBuilder implement ResultBuilder{
public void print(){System.out.printlin("DefaultResultBuilder"};
}
@Component
public class HtmlResultBuilder implement ResultBuilder{
public void print(){System.out.printlin("HtmlResultBuilder"};
}
@Component
public class ResultBuilderFactory{
private final ResultBuilder defaultResultBuilder;
private final ResultBuilder htmlResultBuilder;
public ResultBuilder get(String name){
if(name.equal("HTML") return htmlResultBuilder;
return defaultResultBuilder;
}
Updated:
Just update typo for Component annotation. My bad... I tried the code, and got error: "ResultBuilderFactory required a single bean, but 2 were found....Consider marking one of the beans as @Primary, ... or using @Qualifer..." How can the original code work without using Primary or @Qualifier
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Spring将创建beandefaultResultBuilder和htmlResultBuilder。您需要将它们注入到 ResultBuilderFactory 中。
Lombok 注释 @RequiredArgsConstructor 执行构造函数注入。
或者您可以使用字段注入。但它们不能是最终字段。
但如果可能的话,你应该选择构造函数注入。查看讨论
Spring @Autowire 属性与构造函数
Spring will create bean defaultResultBuilder and htmlResultBuilder. You will need to inject them to ResultBuilderFactory.
Lombok annotation @RequiredArgsConstructor does the constructor injection.
Or you can use field injection. But they can't be final fields.
But you should choose construtor inject if possible. See discussion
Spring @Autowire on Properties vs Constructor