我的主要类(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/