使用场景:例如在工具类的静态方法中使用autowired注入的bean
我是通过读配置文件获取值然后展示的。
前期准备:
@Data
@Component
@ConfigurationProperties(prefix = "test")
public class UserUtil {
private String username;
private Integer age;
}
配置文件:
test:
username: 张三
age: 18
- 方法一:
@Autowired
private UserUtil userUtil;
private static UserUtil userU;
@PostConstruct
public void init(){
userU = userUtil;
}
public static void getStatic(){
System.out.println("用户名:"+userU.getUsername());
System.out.println("年龄:"+userU.getAge());
}
直接测试走起:
成功在静态方法中拿到了注入bean里的参数。
- 方法二:
@RestController
public class TestController {
@RequestMapping("/test")
public void test(){
getStatic();
}
private static UserUtil userUtil;
public TestController(UserUtil userUtil){
this.userUtil = userUtil;
}
public static void getStatic(){
System.out.println("用户名:"+userUtil.getUsername());
System.out.println("年龄:"+userUtil.getAge());
}
}
通过构造方法把这个类注入进来。
注:方法二中构造方法只能在本方法中,例如在TestController中调用TestUtil中的test()方法,其中test方法如果使用该方法会注入失败;而且使用该方法时只能有这一个构造方法,添加其他构造方法会造成注入失败。
所以建议使用第一种方法。
后面转载自:https://www.cnblogs.com/pipicai96/p/11718761.html
分析一波
关于实例变量与构造方法的初始化顺序问题
- Java类会先执行构造方法,然后再给注解了@Value 的属性注入值,所以在执行静态代码块的时候,就会为null。
- Java 及Spring 初始化顺序:java静态属性/静态代码块(根据声明的先后顺序加载)、构造代码块、 构造方法(即:spring创建FetchStockSchedule的实例 交给Spring 管理)、@Value/@ AutoWired/@Resouce 等注解 的成员变量等赋值。
原理
Java中该注解的说明:
@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
此时的执行顺序:
构造方法
- Before Initialization
- 使用PostConstruct注解
- InitializingBean接口
- init-method指定的初始化方法
- After Initialization