在Spring 4.2中注入静态变量

时间:2016-01-31 10:28:38

标签: java spring

我只是试图在Spring 4.2中测试静态变量的注入。 正如我在阅读教程时那样,使用了Spring 2.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文件是:     

<beans>
    <bean id="c" class="beans.Car">
        <property name="carName" value="Audi"/>
    </bean> 
</beans>

我的课程是测试它:

public class Client {
    public static void main(String[] args) {
        ApplicationContext ap= new ClassPathXmlApplicationContext("resources/spring.xml");
        Car car= (Car)ap.getBean("c");
        car.printCar();
    }
}

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

2 个答案:

答案 0 :(得分:5)

  • 关于你的第一个问题,根据comment here(强调是我的):
  

与SPR-8079一起引入的ExtendedBeanInfo的意图       v3.1.0.M2,是为了支持针对非void的依赖注入       返回写入方法。 然而,它也在不经意间引入       支持静态setter方法的注入。

SPR-8079表示自3.1 M2起支持此功能

  • 对于第二个问题,是的,你可以进行静态依赖注入,但因为if (!Model.Read) rowItemContainer.SetBackgroundColor (Android.Graphics.Color.ParseColor ("#FFFDD0")); // unread color else rowItemContainer.SetBackgroundColor (Android.Graphics.Color.White); // read color 是一个Spring托管bean,它是一个单例,所以不需要在你的例子中使用静态方法/字段。

答案 1 :(得分:0)

Spring不负责管理和注入静态实体。这是因为Spring相信dependency injection ,D DI的全部要点是对象依赖关系可以分离,可以作为服务和客户关系进行管理。  依赖项注入的全部目的是使客户端依赖于其配置的服务。

  

期待弹簧来注入静态方法/设置器/变量很大   误解。因为静态变量或方法从根本上讲是邪恶的。

因此出现了一个问题,即为什么Spring(使用其服务-客户端解析技术是如此聪明)不能仅允许静态方法和变量对其进行管理?

让我们通过矛盾来证明这一点

让我们假设spring允许DI用于静态成员(在这种情况下特定可变,但对于to的方法可以理解)。

因此,让我们仔细阅读一下代码,但显然要带上原型范围,以便清楚地理解,而且因为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>

现在,您已经写好了一项服务来让您早上开车:

@Service
public class GetCarInTheMorningService{

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

    public Car getMyCar(){
        reutrn myCar;
    }
}

现在,您希望Sping能够在早上让您获得Audi,但您却遇到了麻烦,这让spring看起来很愚蠢,因为让spring处理DI的全部原因是要获得精确和所需的依赖关系。

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