@Value对static的属性为什么不可以分析

1 知识储备

在搞清楚这个现象之前,我们需要知道一定的Spring知识,请先去理解一下,以便能更好的领悟。

2 异常现象

2.1 起因

@Component
@Slf4j
public class OssUtils {
	 @Value("${oss.endpoint}")
    private static String END_POINT;

 private static void createOSSClient(){
        String endpoint = END_POINT;
        log.info("endpoint的值为:{}",endpoint)
        }
}        

2.2 分析

期望是:
当程序运行起来时候,通过注入,将值注入到END_POINT中,这样我们就可以在静态方法的createOSSClient中进行使用了。
实际结果为:endpoint的值为:null
出现这样的原因,最直观明白是END_POINT没有被注入。
那么为什么没有被注入呢。

  • 静态态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入
  • 而使用静态变量/类变量扩大了静态方法的使用范围.静态方法在spring是不推荐使用的。
  • 依赖注入的主要目的,是让容器去产生 一个对象的实例 ,然后在整个生命周期中使用他们。 一旦你使用静态方法,就不再需要去产生这个类的实例,同时你也不能为一个给定的类,依靠注入方式去产生多个具有不同的依赖环境的实例.这种static field是隐含共享的,并且是一种global全局状态,spring同样不推荐这样去做.

2.3 原因总结

  • Spring 依赖注入是依赖 set方法
  • set方法是是普通的对象方法
  • static变量是类的属性

2.4 解决上述问题

@Component
@Slf4j
public class OssUtils {

    private static String END_POINT;
    
   @Value("${oss.endpoint}")
    private void setEndPoint(String endPoint){
        END_POINT = endPoint;
    }
 private static void createOSSClient(){
        String endpoint = END_POINT;
        log.info("endpoint的值为:{}",endpoint)
        }
  }

3 文献来源

为什么@Value对static属性不能注入
解决的方法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Data public class StorageLocationVo extends StorageLocation { @ApiModelProperty(value = "货架名") private String shelfName; private String type; private Integer sectionNum; private Integer layerNum; } @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_storage_location") @ApiModel(value="StorageLocation对象", description="储位表") public class StorageLocation implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "ID") @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "储位名称") private String name; @ApiModelProperty(value = "储位编码") private String code; @ApiModelProperty(value = "库房id") private Long storeroomId; @ApiModelProperty(value = "站点id") private Long siteId; @ApiModelProperty(value = "识别编码") private String identifyCode; @ApiModelProperty(value = "货架id") private Long shelfId; @ApiModelProperty(value = "是否删除 0:正常 1:删除") @TableLogic private String isDelete; @ApiModelProperty(value = "创建时间") @TableField(fill = FieldFill.INSERT) private Date createTime; @ApiModelProperty(value = "更新时间") @TableField(fill = FieldFill.UPDATE) private Date updateTime; @ApiModelProperty(value = "所属站点名称") @TableField(exist = false) private String siteName; @ApiModelProperty(value = "所属库房名称") @TableField(exist = false) private String storeroomName; @ApiModelProperty(value = "所属货架名称") @TableField(exist = false) private String shelfName; @ApiModelProperty(value = "所属货架编码类型") @TableField(exist = false) private String codeRule; @ApiModelProperty(value = "所属货架节数") @TableField(exist = false) private Integer sectionNum; @ApiModelProperty(value = "所属货架层数") @TableField(exist = false) private Integer layerNum; } 分析一下为什么报java: com.tuimi.gwznkf.storage.entity.vo.StorageLocationVo中的setShelfName(java.lang.String)无法覆盖com.tuimi.gwznkf.storage.entity.StorageLocation中的setShelfName(java.lang.String) 返回类型void与com.tuimi.gwznkf.storage.entity.StorageLocation不兼容 问题解决
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值