//这种是错误的写法
@Autowired
private static TestDao testDao;
这种代码中获取的这个对象是null。
原因:
当类加载器加载静态变量时,Spring的上下文环境还没有被加载。这是因为初始化类的加载顺序导致的,程序启动时会加载根路径下所有的类,不管这个类是否会用到都会去加载;会先初始化静态变量和执行静态代码块,这时候无法创建对象,而@autowired是要注入一个对象。
查看AutowiredAnnotationBeanPostProcessor类源码:
List<InjectedElement> currElements = new ArrayList();
ReflectionUtils.doWithLocalFields(targetClass, (field) -> {
AnnotationAttributes ann = this.findAutowiredAnnotation(field);
if (ann != null) {
if (Modifier.isStatic(field.getModifiers())) {
if (this.logger.isInfoEnabled()) {
this.logger.info("Autowired annotation is not supported on static fields: " + field);
}
return;
}
boolean required = this.determineRequiredStatus(ann);
currElements.add(new AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement(field, required));
}
});
注入的最真实原因:扫描Class类需要注入的元数据的时候,直接选择忽略掉了static成员(包括属性和方法)。
spring有注入机制,我们不应该或者是不推荐使用静态的属性或者方法,
因为一旦你使用静态方法,就不再需要去产生这个类的实例,自然也就不需要注入了,同时你也不能为一个给定的类,依靠注入方式去产生多个具有不同的依赖环境的实例,这种静态属性是隐含共享的,并且是一种global全局状态。
————————————————
版权声明:本文为CSDN博主「覃会程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HC199854/article/details/119575907