这是我第一次尝试使用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,这是我遇到的问题,这是第一个选项,我需要在自动装配时以某种方式提供参数
第二个选项是实现ApplicationContextAware并使用getBean方法,但这是如何为每个bean执行此操作的正确方法吗?
答案 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);
}
}
}