-2

我正在尝试学习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();

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

我不知道它是如何支持的,而不是抛出一些异常作为它必须通过的 spring doc

 org.springframework.beans.factory.config.MethodInvokingFactoryBean

我正在使用 spring 4,我的代码有什么问题?

4

2 回答 2

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)会影响 beant1并且t2- 您看到问题了吗?

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

于 2018-02-17T06:38:39.630 回答
0

静态变量是类标签变量。因此,当加载类时,可能是那个时候还没有加载 Spring 上下文。但是,有一个解决方法是让 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);
    }
 }
于 2018-02-17T06:39:32.437 回答