Мой основной класс: 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. Я попытался включить только самое простое, хотя на данный момент. Есть предположения?
Вы пытались дать представление 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 для классов.