静态方法Depdendecy注入失败

时间:2018-02-17 06:16:09

标签: java spring dependency-injection spring-config

我正在尝试学习spring框架静态方法依赖注入, 已经发布了很多问题,但我的问题不同了,因为我已经上了一个课程

 package com.model;

    public class Test {

      private static String name;
      //private static Engine  engine;


     public static void setName(String name) {
        Test.name = name;
    }

    public  static void printData(){
      System.out.println("Helllo: "+name);
    }
 }

并且想要注入一个属性调用名称并通过使用spring.xml注入数据来检查它是否支持常规DI

spring.xml包含

<bean id="t" class="com.model.Test">
    <property name="name" value="Vishal"/>
</bean>

通过属性和主

传递值
ApplicationContext ap = new ClassPathXmlApplicationContext("resources/spring.xml");
    Test test = (Test)ap.getBean("t");
    test.printData();

当我运行此代码时,它工作正常。

我不知道它是如何支持而不是抛出一些例外,因为必须通过它的春季文档

 org.springframework.beans.factory.config.MethodInvokingFactoryBean

我正在使用spring 4,我的代码出错了吗?

2 个答案:

答案 0 :(得分:0)

依赖注入不是使用静态方法/字段注入值的方法。考虑为同一个类定义两个bean:

<bean id="t1" class="com.model.Test">
    <property name="name" value="Vishal"/>
</bean>
<bean id="t2" class="com.model.Test">
    <property name="name" value="Lorem ipsum"/>
</bean>

您的静态方法会修改在所有实例间共享的静态字段。让我们说Spring允许你这样做(我不确定这是否可行,从未尝试过这样做,因为这是反模式)。我们还假设t1实例首先被实例化。实例化t2后,您将获得:

t1.printData()
// Output: Hello: Lorem ipsum

更有问题的是,你可以在任何时候这样做:

Test t3 = new Test();
t3.setName("Foo");

您在Spring Dependency Injection容器外部执行此操作,t3只是一个局部变量,与Spring无关,但调用t3.setName("Foo)会影响bean t1t2 - 你看到了问题吗?

结论 - 使用Spring DI容器来实例化具有非静态字段和方法的类。 Spring(默认情况下)创建每个bean的单个实例,您可以在整个应用程序中共享它。使这些bean无状态也很重要 - 如果在初始化后开始改变它们的状态,你可能会很快遇到麻烦。尝试搜索“spring dependency injection best practices”,以获得有关如何使用Spring的一些很好的示例。

答案 1 :(得分:0)

静态变量是类标签变量。因此,当Class加载时,Spring上下文可能仍然没有加载。但是,通过使setter非静态可以工作,有一种解决方法。但我相信在您的申请中不应该要求这样做。这种类型的要求可能表明设计不良,您应该重新审视应用程序的设计。以下是使setter非静态的解决方法。 解决方法:

package com.model;

    public class Test {

      private static String name;
      //private static Engine  engine;


     public void setName(String name) {
        Test.name = name;
    }

    public  static void printData(){
      System.out.println("Helllo: "+name);
    }
 }