Spring自动装配不起作用(依赖注入)

时间:2016-03-11 23:14:59

标签: java spring dependency-injection autowired

编辑:我刚发现我的问题基本上是解释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在内部完成它。这是否意味着我不能在那里使用自动装配?

谢谢:)

3 个答案:

答案 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和实例引用名称是否不同。

您想要达到的目标可以通过三种方式实现。

  1. 将您的xml配置更改为与引用名称
  2. 的bean ID匹配
      

    bean id =“c”class =“some.package.C”

    1. 更改实例引用名称,使其与bean id相同 @Autowired
    2.   

      私人C myC;

      1. 提供限定符以表明您的自动装配
      2.   

        @Autowire   @Qualifier( “MYC”)   私人C c;