我只是试图在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,如上所示吗?
答案 0 :(得分:5)
与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使用了这种模式(反模式?)。