编辑:我刚发现我的问题基本上是解释here。所以我现在首先尝试使用我能找到的信息。
我正在使用Spring Framework执行我的第一步。它的自动装配功能。我跟着this tutorial,但似乎我错过了一些东西。我已成功将所有弹簧罐添加到我的项目中,并在我的src文件夹中定义了一个配置(“springbeans.xml”),如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
<bean id="myC" class="some.package.C"></bean>
</beans>
在我的应用程序的main方法中,我正在初始化配置:
new ClassPathXmlApplicationContext("springbeans.xml");
请注意,我只是创建一个匿名引用来触发初始化,但不会将其存储到任何变量,因为我不是试图通过context.getBean("myC")
检索我的实例(顺便说一下,这是有效的! )。但据我所知,它应该足以触发所有内容的初始化?
那么,我想要自动装配的包some.package
中有这个类“C”。该类提供了一个没有参数的公共构造函数。我有不以任何方式注释这个类,也许这就是问题所在。但是我曾试图将其注释为@Service
或@Component
,但它没有解决问题。但说实话,我并不真正了解何时使用这些注释及其含义。
无论如何,我还有一些其他课程,我尝试自动装配我的C实例:
...
@Autowired
private C c;
和该类中使用c变量的一些方法。但是当该方法执行时,我得到一个NullPointerException,显然Autowiring不起作用。
我做错了什么?
编辑:正如向我解释的那样,我的问题是我使用自动装配的类也必须是一个bean,并且也是由spring初始化的。但问题是:在我的例子中,这个类实际上是一个JavaFX控制器类。我没有实例化它,JavaFX在内部完成它。这是否意味着我不能在那里使用自动装配?
谢谢:)
答案 0 :(得分:1)
好的,我找到了一个如何使用Spring和JavaFX控制器的解决方案。关键是用弹簧管理的加载器加载FXML:
public class SpringFxmlLoader {
private static final ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springbeans.xml");
public static Parent load(String url) {
try (InputStream fxmlStream = SpringFxmlLoader.class
.getResourceAsStream(url)) {
System.err.println(SpringFxmlLoader.class
.getResourceAsStream(url));
FXMLLoader loader = new FXMLLoader();
loader.setControllerFactory(clazz -> applicationContext.getBean(clazz));
return loader.load(fxmlStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
现在,当我在Spring配置中将控制器定义为bean,并将自动装配目标定义为bean时,我可以在FX控制器类中成功自动装配目标类。
答案 1 :(得分:0)
@Autowired 私人C myC; 您必须将对象重命名为您的ID名称
答案 2 :(得分:0)
当spring代表您创建bean时,您需要告诉它您的bean id和实例引用名称是否不同。
您想要达到的目标可以通过三种方式实现。
bean id =“c”class =“some.package.C”
私人C myC;
@Autowire @Qualifier( “MYC”) 私人C c;