gpt4 book ai didi

基于 Java 的配置,带参数的 Autowiring bean

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:13 24 4
gpt4 key购买 nike

这是我第一次尝试使用 Spring 编写 swing 应用程序(仅基于 java 的配置,我不需要 XML)。问题是我不知道如何 Autowiring 需要参数的 bean,在我的应用程序中,我将创建大量的 JPanel(以及它们的 LineBorder 等),并且我正在努力寻找正确的方法来执行此操作。我是否应该创建一个 bean 定义来返回一个简单的 JButton,将范围设置为“原型(prototype)”, Autowiring 它并在我的 GUI 类中完成所有初始化?

同样在 swing 应用程序中,是否应该使用 spring 创建所有内容?(在我的配置类之外没有一个“new”关键字),就像我有的时候一样

linebuttonPanel.setPreferredSize(new Dimension(0, 70));

我应该编写一个返回这样的新 Dimension bean 的方法吗?

Dimension d = context.getBean("dimension");
d.setSize(0, 70);
linebuttonPanel.setPreferredSize(d);

或者我应该将维度初始化移到配置类中并编写此内容

linebuttonPanel.setPreferredSize(context.getBean("dimension", 0, 70));

我试图尽可能使用@Autowire,这是我遇到的问题,这是第一个选项,我需要在 Autowiring 时以某种方式提供参数

enter image description here

第二个选项是实现 ApplicationContextAware 并使用 getBean 方法,但是这是为每个 bean 执行此操作的正确方法吗?

enter image description here

最佳答案

当您必须创建按钮时,您需要访问应用程序上下文。

您可以将 ApplicationContext Autowiring 到您的 bean 中并从那里查找 Button bean,但这是非常糟糕的主意。您不应该将整个应用程序上下文注入(inject)到您的特定 bean 中,它破坏了 spring 设计的松散耦合思想。

因此,您最好从 GUI 类定义中删除 ApplicationContextAware 接口(interface),并删除 ApplicationContext applicationContext 类字段。

在这种情况下,最好将 bean 创建操作抽象化并在基于 java 的应用程序配置中实现它们。

我的意思是你可以定义抽象方法

protected abstract JButton getButton(String name)

在您的 GUI 类中,因此该类也会变得抽象。

然后您可以在当前配置中进行 bean 定义,如下所示:

@Bean
public GUI gui() {
return new GUI() {
@Override
protected JButton getButton(String name) {
// note, here you're referencimg your Bean jButton of scope "prototype"
return jButton(name);
}
}
}

关于基于 Java 的配置,带参数的 Autowiring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35362144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com