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

时间:2016-02-12 12:01:31

标签: java spring swing autowired spring-annotations

这是我第一次尝试使用Spring编写swing应用程序(仅基于java的配置,我不想要XML)。问题是我不知道如何自动装配需要参数的bean,在我的应用程序中我将创建大量的JPanel(对于他们LineBorder等)并且我正在努力寻找正确的方法这该怎么做。我应该只创建一个返回简单JButton的bean定义,将范围设置为" prototype",自动装配它并在我的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,这是我遇到的问题,这是第一个选项,我需要在自动装配时以某种方式提供参数

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:0)

我可能会使用工厂方法:

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

因此,您可以避免使用“新”关键字,让春天为您创造一切。

作为附加提示,您不必实现ApplicationContextAware,您只需自动装配ApplicationContext

答案 1 :(得分:0)

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

你可以将ApplicationContext自动装入你的bean并从那里查找Button bean,但它是非常糟糕的想法。你不应该将整个应用程序上下文注入到你的特定bean中,它会打破弹簧设计的松散耦合思想。

因此,您最好从ApplicationContextAware类定义中删除GUI界面,并删除ApplicationContext applicationContext类字段。

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

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

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);
        }
    }
}