Основной класс по электромонтажу в приложении Swing / Spring

1

Мой основной класс: package 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>

Однако, когда я запускаю приложение, я получаю нуль для представления. Я занимаюсь Spring в течение нескольких лет, а в прошлом я использовал ленивое создание (если (mWndView == null) mWndView =... return mWndView) или сделал геттеры и сеттеры для представления публичными и добавил ссылки внутри application-context - оба, которые вызвали меня вокруг этой проблемы, но я стараюсь, чтобы этот проект больше полагался на весну, и нет никаких оснований делать публикацию View открытой, поскольку ее никогда не следует публично публиковать за пределами основного класса, который больше трамплина к главному событию.

Что я могу сделать неправильно, потому что View не автоуведомлен? Как вы можете видеть, я захватываю основное приложение из файла контекста приложения, чтобы оно управлялось весной. Я не тестировал класс View, но сейчас все, что он содержит, является меткой и списком, даже не получающим доступа к ним, но автоматически и автоматически определяемым в файле контекста приложения. При необходимости я могу включить более полный контекст приложения и/или класс APIGeneratorFrame. Я попытался включить только самое простое, хотя на данный момент. Есть предположения?

  • 1
    Автопроводка основного класса -> Звучит ужасно :)
  • 0
    Почему? Остальное автопроводка. Spring позаботится о том, чтобы определить, создан ли какой-либо обязательный компонент или что-то еще, убедившись, что он не равен нулю. В целом, это уменьшает размер методов - я мог бы потенциально разделить основной класс на основной класс и контроллер, но я всегда объединял 2 из них, и у контроллера было бы представление об этом - это решило бы мою проблему. м почти наверняка
Теги:
spring
swing
autowired

1 ответ

2
Лучший ответ

Вы пытались дать представление 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" />

Чтобы использовать компонентное сканирование, вы можете опустить компоненты в текущем контексте и добавить аннотации @Component для классов.

  • 0
    Я не нашел ничего, что точно объясняло бы, что @Component делает вне настроек Spring-MVC - что он делает? После публикации я попытался добавить id, а также отделить интерфейс контроллера от основного класса - просто переместил NPE в класс Controller - тоже не подключая представление там автоматически. Что вы имеете в виду опустить бины в текущем контексте? Как Spring узнает, что отправить конструкторам и установить значения свойств?
  • 0
    Просто попытался @Component и удалил хотя бы App, Controller и View и получил ошибку, что не был найден ни один компонент с именем контроллер - я не уверен, как вывести компонент и запустить Spring без ApplicationContext.getBean (... )
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню