2016-02-12 135 views
1

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

在Swing应用程序

此外,应利用春季创造一切吗?(不是一个单一的“新的”我的配置类的外关键字),就像当我有

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

我应该不是写一个方法返回一个像这样的新维度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

第二个选项是实现Applicati onContextAware和使用getBean方法,但这是如何为每个bean做到这一点的正确方法?

enter image description here

+0

你有没有考虑,而混合弹簧和摆动,你可能会遇到的线程问题? Swing要求您尊重其线程模型(Event Dispatch Thread),并且在将组件创建委派给Spring时可能很难控制。在我们的项目中,在客户端,我们只使用Spring来实现由Swing组件调用的服务,但我们保持对所有组件生命周期的控制。并不是说这是不可能实现的,但是那里的教程似乎完全忽略了这一点。 –

+0

不幸的是'@ Autowared'不支持传递参数。所以,你的第二种方法已经足够好了,但是请注意:不要实现'ApplicationContextAware'接口。只需使用@Autowired注释标记类的ApplicationContext属性即可。此注释旨在简化对象的绑定,包括实现所有“Aware”接口。 –

回答

0

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

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

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

在这种情况下,最好使bean创建操作abstract并在基于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); 
     } 
    } 
} 
+0

如果我有带注释@Bean和@Scope(“prototype”)的JTextField的bean定义,并且在它内部创建并添加新的KeyAdapter,我必须为该适配器创建一个单独的bean定义,该定义也将被标记作为@Scope(“prototype”)并引用它,或者仅仅写JTextField field = new JTextField()就足够了。 field.addKeyListener(new KeyAdapter(){}); ? – Peter

+0

@Peter,简而言之,如果您需要在您的应用程序中创建许多嵌套对象,那么使用bean定义很难做到这一点。我描述了如何将原型注入单例的通用机制。为了避免bean的定义,最好在代码中使用简单的构造函数,并且不要使用bean来创建应用程序中的每个对象。 –

+0

这里不需要执行lookup-method。这种方法仍然不能解决将参数传递给构造函数的问题。因为需要调用'BeanFactory'的方法来创建新的bean,所以我们不会从创建lookup-method –

0

我可能会使用一个工厂方法:

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

这样就可以避免“新”的关键字,让春天的一切为你创造。

作为一个额外的暗示,你就不必执行了ApplicationContextAware,你可以自动装配的ApplicationContext