java - 在 Swing/Spring 应用程序中 Autowiring 主类

标签 java spring swing autowired

我的主要类(class)是: 包 net.draconia;

import java.io.Serializable;

import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

import net.draconia.apigenerator.ui.APIGeneratorFrame;

public class APIGenerator implements Runnable, Serializable
{
    private static final long serialVersionUID = 3837819659124519652L;

    @Autowired
    private APIGeneratorFrame mWndView;

    public APIGenerator()
    { }

    protected APIGeneratorFrame getView()
    {
        return(mWndView);
    }

    public void run()
    {
        try
            {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());

            getView().setVisible(true);
            }
        catch(Exception objException)
            {
            objException.printStackTrace(System.err);
            }
    }

    public static void main(final String[] sArrArgs)
    {
        ApplicationContext objContext = new ClassPathXmlApplicationContext("application-context.xml");

        try
            {
            ((ConfigurableApplicationContext)(objContext)).registerShutdownHook();

            APIGenerator objGenerator = ((APIGenerator)(objContext.getBean("app")));

            SwingUtilities.invokeLater(objGenerator);
            }
        finally
            {
            ((ConfigurableApplicationContext)(objContext)).close();
            }
    }
}

出于所有意图和目的,我们假设 APIGeneratorFrame 只是:

public class APIGeneratorFrame extends JFrame
{ }

我的简化 application-context.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd">

    <bean class="net.draconia.apigenerator.ui.APIGeneratorFrame" />

    <bean class="net.draconia.APIGenerator" id="app" />
</beans>

当我运行应用程序时 - 我得到的 View 为空。我已经做Spring好几年了,过去我使用惰性创建(if(mWndView == null) mWndView = ... return mWndView)或将View的getter和setter设为公共(public),并在内部添加引用application-context - 这两个问题都让我解决了这个问题,但我正在尝试让这个项目更多地依赖Spring,并且确实没有理由将 View 公开,因为它不应该在主类之外公开访问更多的是主要 Activity 的跳板。

我可能做错了什么, View 没有被 Autowiring ?正如您所看到的,我从应用程序上下文文件中获取主应用程序,因此它由 spring 管理。我还没有测试 View 类,但现在它包含的只是一个标签和一个列表,甚至还没有访问它们,但也在应用程序上下文文件中自动连接和定义。如有必要,我可以包含更完整的应用程序上下文和/或 APIGeneratorFrame 类。我暂时尝试只包含最简单的内容。有什么想法吗?

最佳答案

您是否尝试过为 View bean 提供一个 id?

<bean id="mWndView" class="net.draconia.apigenerator.ui.APIGeneratorFrame" />

进一步说明:

@Autowired是Spring特有的一个注解,比较通用的是@Inject。

返回(mWndView);语句不需要括号。

您可以使用“http://www.springframework.org/schema/context ”中的组件扫描标签来代替手动接线:

<context:component-scan base-package="net.draconia" />

要使用组件扫描,您可以省略当前上下文中的 bean,并在类上添加 @Component 注释。

关于java - 在 Swing/Spring 应用程序中 Autowiring 主类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27152588/

相关文章:

java - Hibernate 4 延迟加载不起作用

java - Spring初始化中没有详细信息创建名为 'entityManagerFactory' + NullPointerException的bean时出错

java - 多个 odata servlet 和端点 - 可能吗?

java - 如何允许用户编辑 JTable 中的单行?

java - 带有枚举参数的 Spring @Query 注解

java - 如何从 Slack API 获取 channel 列表?

java - 如何在对象的数组属性中添加 Rest 验证?

java - java.util.HashSet 中的 contains() 方法的行为不符合我的预期

Java 俄罗斯方 block - 为每一 block 设置新颜色

java - Java内置字体和第三方字体有什么区别?