原因:在项目开发中,一个类的final属性值需要用到springBoot配置文件中的信息。
错误展示:程序启动时, 这样会报找不到usrename的bean信息。就是username没有值
public class test{
@Value(value = "${data.dataSource.username}")
private String username;
@Value(value = "${data.dataSource.pass}")
private String pass;
private User user = new User(username,pass);
}
@Value
这个是spring框架中的注解,可以注入配置文件(yml,propertiery)的属性值或者表达式,它可以将配置信息注入到一个目标类或者方法的属性中去。
支持从配置文件、环境变量、系统属性等多种来源注入值。
注意问题:
处理中文乱码:如果在配置文件中使用中文,可能会遇到编码问题。确保配置文件的编码格式正确(如UTF-8),并且在读取时使用适当的解码方式,可以避免中文乱码问题。
@value的作用时间:Bean初始化时,@Value注解的值会在Spring容器创建和初始化Bean时被注入。当Spring容器启动时,他会读取所有的配置文件,并在创建Bean时将@Value注解的值注入到相应的字段中。
与java类加载相比
java类加载:java的类加载机制是在JVM启动时加载类得定义,包括静态初始化快的初始化。在类加载的过程中,静态字段和静态初始化块被执行,但是这与spring的bean加载是不同的过程。
sping bean初始化: Spring容器在启动时会加载Bean的定义,并创建和初始化Bean。@Value注解的值会被注入到Bean的属性中。这发生在Bean的实例化之后,但在Bean的@PostConstruct方法或其他初始值回调之前。
@PostConstruct注解正是解决这个问题的关键。
可以写一个初始化方法,在方法内进行赋值
public class test{
@Value(value = "${data.dataSource.username}")
private String username;
@Value(value = "${data.dataSource.pass}")
private String pass;
private User user;
@PostContrusr
public void init(){
user = new User(username,pass)
}
}