Spring bean定义和注入

发布于 2025-01-10 06:54:50 字数 953 浏览 5 评论 0原文

我刚刚开始学习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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜无邪 2025-01-17 06:54:50

Spring将创建beandefaultResultBuilder和htmlResultBuilder。您需要将它们注入到 ResultBuilderFactory 中。

Lombok 注释 @RequiredArgsConstructor 执行构造函数注入。

@Component
@RequiredArgsConstructor
public class ResultBuilderFactory{
    private final ResultBuilder defaultResultBuilder;
    private final ResultBuilder htmlResultBuilder;
}

或者您可以使用字段注入。但它们不能是最终字段。

@Component
public class ResultBuilderFactory{

    @Autowired
    private  ResultBuilder defaultResultBuilder;

    @Autowired
    private  ResultBuilder htmlResultBuilder;
}

但如果可能的话,你应该选择构造函数注入。查看讨论
Spring @Autowire 属性与构造函数

Spring will create bean defaultResultBuilder and htmlResultBuilder. You will need to inject them to ResultBuilderFactory.

Lombok annotation @RequiredArgsConstructor does the constructor injection.

@Component
@RequiredArgsConstructor
public class ResultBuilderFactory{
    private final ResultBuilder defaultResultBuilder;
    private final ResultBuilder htmlResultBuilder;
}

Or you can use field injection. But they can't be final fields.

@Component
public class ResultBuilderFactory{

    @Autowired
    private  ResultBuilder defaultResultBuilder;

    @Autowired
    private  ResultBuilder htmlResultBuilder;
}

But you should choose construtor inject if possible. See discussion
Spring @Autowire on Properties vs Constructor

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文