Java 在弹簧4.2中注入静态变量

Java 在弹簧4.2中注入静态变量,java,spring,Java,Spring,我只是想测试Spring4.2中静态变量的注入。 在我学习教程的过程中,我使用了Spring2.0。在该教程中,如果按照以下步骤进行: public class Car { private static String carName; public static void setCarName(String carName) { Car.carName = carName; } public static void printCar(){

我只是想测试Spring4.2中静态变量的注入。 在我学习教程的过程中,我使用了Spring2.0。在该教程中,如果按照以下步骤进行:

public class Car {
    private static String carName;

    public static void setCarName(String carName) {
        Car.carName = carName;
    }

    public static void printCar(){
        System.out.println("Car name is: " + carName);
    }
}
我的xml文件是:

上面的代码在与Spring2.0一起使用时抛出错误(如下面的教程所示)。 但是,如果我在Spring4.2中尝试相同的代码,它不会显示任何错误,代码工作正常。为什么行为上有差异??Spring在较新版本中是否对静态变量的注入做了任何更改? 所以我的问题是,我们可以直接进行静态变量的DI吗,如上图所示??

  • 对于你的第一个问题,根据a(重点是我的):
扩展Beaninfo的意图,于年随SPR-8079一起引入 v3.1.0.M2,支持针对非void的依赖项注入 返回写方法但是,它也无意中引入了 支持针对静态setter方法的注入。

显示从3.1平方米起支持此功能

  • 对于第二个问题,您可以进行静态依赖项注入,但是因为
    Car
    是一个spring管理的bean,它是一个单例,所以在您的示例中不需要使用静态方法/字段

Spring不负责管理和注入静态实体。这是因为Spring相信,而D DI的全部要点是,对象依赖性可以解耦,可以作为服务和客户机关系进行管理。 依赖项注入的整个要点是,客户机依赖于服务进行配置

期望spring注入静态方法/设置器/变量是一个大问题 误解。因为静态变量或方法有着本质上的邪恶

因此,问题出现了:为什么Spring(它的服务客户机解析技术非常智能)不允许静态方法和变量由它来管理?

让我们用矛盾来证明这一点:

让我们假设spring允许对静态成员使用DI(在这种情况下是可变的,但对于要使用的方法也可以同样理解)

因此,让我们来看看您的代码,但显然要清楚地理解原型的作用域,因为Spring的行为应该与作用域无关

public class Car {
    private static String carName;

    public static void setCarName(String carName) {
        Car.carName = carName;
    }

    public static void printCar(){
        System.out.println("Car name is: " + carName);
    }
}
下面是修改后的xml:

<beans>
    <bean id="c" class="beans.Car" scope="prototype">
        <property name="carName" value="Audi"/>
    </bean> 
    <bean id="d" class="beans.Car" scope="prototype">
        <property name="carName" value="Dodge"/>
    </bean>
</beans>
现在你希望斯宾格在早上给你买奥迪,但是你被道奇困住了,这让spring看起来很愚蠢,因为让spring处理DI的全部原因是为了获得精确的和必需的依赖性


因此,spring使用这种模式(反模式?)。

始终包括您得到的错误。如果没有,很难判断错误是由代码还是环境造成的。因为我使用的是Spring 4.2,所以我没有收到任何错误,但在教程中,上面的代码是在Spring 2.0中完成的,然后出现了一个
NotWritablePropertyExceptin
。所以我的问题是,我们可以在Spring4.0中直接进行静态变量的DI吗?如上所示?请注意,仅仅因为您可以这样做并不意味着您应该这样做。
public class Car {
    private static String carName;

    public static void setCarName(String carName) {
        Car.carName = carName;
    }

    public static void printCar(){
        System.out.println("Car name is: " + carName);
    }
}
<beans>
    <bean id="c" class="beans.Car" scope="prototype">
        <property name="carName" value="Audi"/>
    </bean> 
    <bean id="d" class="beans.Car" scope="prototype">
        <property name="carName" value="Dodge"/>
    </bean>
</beans>
@Service
public class GetCarInTheMorningService{

    @Qualifier("c")
    @Autowired
    private Car myCar;

    public Car getMyCar(){
        reutrn myCar;
    }
}