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

标签 java spring swing autowired spring-annotations

这是我第一次尝试使用 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/

相关文章:

java - 将 Swing 组件放在另一个组件上而不将布局从自由设计更改为另一个组件?

java - 使用反射制作对象

java - 我想使用 spring 获得多个 mysql 数据库的结果

java - 尝试使用扫描仪读取 .txt 文件时文本丢失

hibernate @onetomany 关系更新而不是在保存期间插入

java - 如何在不每次加载 URL 的情况下从 JPanel 调整子 WebView/JFXPanel 的大小?

java - Google Guava isNullOrEmpty 用于集合

hibernate - Spring/JPA/Hibernate/PostgreSQL 在嵌套事务中抛出 EntityNotFoundException

java - 如何使用 Netty4ClientHttpRequestFactory 设置 Spring AsyncRestTemplate 代理?

java - 关于 Swing 图像格式和服务提供商