我正在尝试学习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,我的代码出错了吗?
答案 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 t1
和t2
- 你看到了问题吗?
结论 - 使用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);
}
}