程序员子龙(Java面试 + Java学习) 程序员子龙(Java面试 + Java学习)
首页
学习指南
工具
开源项目
技术书籍

程序员子龙

Java 开发从业者
首页
学习指南
工具
开源项目
技术书籍
  • 基础

  • JVM

  • Spring

    • 动态代理-CGLIB
    • Hibernate Validator 参数校验优雅实战
    • Jackson序列化json时null转成0或空串
    • 别自己瞎写工具类了!SpringBoot中自带工具类,开发效率增加一倍
    • Spring @Autowired Map
    • SpringBoot 缓存之 @Cacheable 详细介绍与失效时间TTL
    • Spring Security 入门
    • Spring Security原理
    • Spring项目整合MybatisPlus出现org.mybatis.logging.LoggerFactory Not Found 异常
    • Spring在代码中获取bean
    • 别再乱写了,Controller 层代码这样写才足够规范!
    • 非静态变量给静态变量赋值
    • 过滤器与拦截器区别、使用场景
    • 接口重试机制 Spring-Retry
    • 利用cglib动态创建对象或在原对象新增属性
    • 聊聊spring事务失效的场景
    • Spring Event 事件解耦
    • 最全的Spring依赖注入方式
    • Spring初始化之ApplicationRunner、InitializingBean、@PostConstruct 使用详解
    • 为啥不建议用 BeanUtils.copyProperties 拷贝数据
  • 并发编程

  • Mybatis

  • 网络编程

  • 数据库

  • 缓存

  • 设计模式

  • 分布式

  • 高并发

  • SpringBoot

  • SpringCloudAlibaba

  • Nginx

  • 面试

  • 生产问题

  • 系统设计

  • 消息中间件

  • Java
  • Spring
程序员子龙
2024-01-29

非静态变量给静态变量赋值

@Value注解介绍: 作为Spring的一个常用注解,其作用是通过注解将常量、配置文件中的值和其他bean的属性值注入到变量中,作为变量的初始值。

@Value("${login.name}")
private String loginName;

1
2
3

@value不能直接注入值给静态变量

@Value("${login.name}")
private static String loginName;
1
2

在Java中,静态变量也称为类变量。也就是说,它们属于一个类,而不是一个特定的实例。因此,类初始化的时候也将初始化静态变量相反,类的实例 初始化的时候也将初始化 实例变量(非静态变量)。类的所有实例共享该类的静态变量。

@value 是在 bean实例化后,在属性填充过程中进行赋值的,static初始化要早于@value。

实际场景中,常量需要通过配置文件来配置,该怎么办?

第一种方式:

把@Value(value="${local.file.temp.dir}")放到静态变量的set方法上面即可,需要注意的是set方法要去掉static,还有就是当前类要交给spring来管理

    /**文件存储目录*/
    public static String SAVE_PATH;

    //记得去掉static
    @Value("${local.file.temp.dir}")
    public void setSavePath(String savePath){
        SAVE_PATH = savePath;
    }


1
2
3
4
5
6
7
8
9
10

配置文件:

local:
  file:
    temp:
      dir : /data/temp
1
2
3
4

第二种方式:

使用 @postconstruct 注解

    /**文件存储目录*/
    public static String SAVE_PATH;

    @Value("${local.file.temp.dir}")
    public String SAVE_PATH_TEMP;

    @PostConstruct
    private void init(){
        SAVE_PATH = SAVE_PATH_TEMP;
    }

  @GetMapping("test")
    public void test(){

        System.out.println(SAVE_PATH);
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

@PostConstruct 是在 bean 初始化(initializeBean)过程中调用的,是在@value之后调用的,可以通过这种方式给静态变量赋值。

第三种方式:

实现InitializingBean 接口

public class IndexController implements InitializingBean {

    /**文件存储目录*/
    public static String SAVE_PATH;

    @Value("${local.file.temp.dir}")
    public String SAVE_PATH_TEMP;

    @GetMapping("test")
    public void test(){

        System.out.println(SAVE_PATH);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        SAVE_PATH = SAVE_PATH_TEMP;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

InitializingBean 接口也是在bean初始化(initializeBean)过程中调用的,具体可以看下spring bean 的实例化过程。

使用 @value 注解读取配置文件给静态变量赋值的方法给大家介绍到这里,希望对大家有所帮助。

上次更新: 2024/01/30, 15:08:57
别再乱写了,Controller 层代码这样写才足够规范!
过滤器与拦截器区别、使用场景

← 别再乱写了,Controller 层代码这样写才足够规范! 过滤器与拦截器区别、使用场景→

最近更新
01
一个注解,优雅的实现接口幂等性
11-17
02
MySQL事务(超详细!!!)
10-14
03
阿里二面:Kafka中如何保证消息的顺序性?这周被问到两次了
10-09
更多文章>
Theme by Vdoing | Copyright © 2024-2024

    辽ICP备2023001503号-2

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式