Java 静态方法Depdendecy注入失败
我正在学习spring框架静态方法依赖注入, 有许多问题已经张贴,但我的问题是不同的,因为我已经采取了一个类Java 静态方法Depdendecy注入失败,java,spring,dependency-injection,spring-config,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;
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
xml包含
<bean id="t" class="com.model.Test">
<property name="name" value="Vishal"/>
</bean>
当我运行这段代码时,它工作得很好
我不知道它是如何支持的,而是在SpringDoc必须通过时抛出一些异常
org.springframework.beans.factory.config.MethodInvokingFactoryBean
我使用的是Spring4,我的代码有什么问题???依赖项注入不是使用静态方法/字段来注入值的方法。考虑为同一类定义两个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>
更麻烦的是,您可以在任何时候执行以下操作:
Test t3 = new Test();
t3.setName("Foo");
在Spring依赖项注入容器外部执行时,t3
只是一个局部变量,与Spring无关,但是调用t3.setName(“Foo)
会影响beant1
和t2
-看到问题了吗
结论-使用SpringDI容器实例化具有非静态字段和方法的类创建每个bean的单个实例,您可以在整个应用程序中共享它。使这些bean无状态也很重要-如果在初始化后开始更改它们的状态,您可能会很快遇到问题。尝试搜索“spring依赖项注入最佳实践”获取一些关于如何使用Spring的好例子。静态变量是class-label变量。因此,当类被加载时,可能是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);
}
}
问题是什么?它是如何通过对静态方法使用常规依赖项注入来支持的
Test t3 = new Test();
t3.setName("Foo");
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);
}
}