Java 基于配置,带参数的自动装配 bean

Java based configuration, autowire bean with arguments

这是我第一次尝试使用 Spring(仅基于 java 配置,我不需要 XML)编写 swing 应用程序。问题是我不知道如何自动装配一个需要参数的 bean,在我的应用程序中我将创建大量的 JPanel(以及它们的 LineBorder 等)并且我正在努力寻找正确的方法做这个。我是否应该只创建一个将 return 简单 JButton 的 bean 定义,将范围设置为 "prototype",自动装配它并在我的 GUI class 之后进行所有初始化?

同样在 swing 应用程序中,是否应该使用 spring 创建所有内容?(不是我的配置 class 之外的单个 "new" 关键字),就像我有

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

我应该改为编写一个方法 return 像这样创建一个新的 Dimension bean 吗?

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

或者我应该将维度初始化移动到配置中 class 并写下这个

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

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

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

我可能会使用工厂方法:

public JButton createButton(String name) {
    (JButton)button = ctx.getBean(JButton.class);
    button.setName(name);
    return name;
}

因此您可以避免 "new" 关键字,让 spring 一切为您创造。

额外提示,您不必实现 ApplicationContextAware,您可以直接自动装配 ApplicationContext

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

您可以将 ApplicationContext 自动装配到您的 bean 中并从那里查找 Button bean,但这是一个非常糟糕的主意。您不应该将整个应用程序上下文注入到您的特定 bean 中,它打破了 spring 设计的松耦合想法。

所以您最好从 GUI class 定义中删除 ApplicationContextAware 接口并删除 ApplicationContext applicationContext class 字段。

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

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

protected abstract JButton getButton(String name)

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

然后你可以在你当前的配置中定义一个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);
        }
    }
}