1. 前言
默认情况下,Spring加载Bean的顺序是不确定的(或者可以理解为,按编译后的class文件顺序加载)。当我们需要控制Bean加载顺序以满足特定的需求时,@DependsOn就派上用场了。
假设需求场景:C类加载时要从缓存读取数据,D类加载时会初始化缓存数据。因此,我们必须控制D类优先加载,否则C读到的缓存会是空的。
2. 代码实现
先验证没有加 @DependsOn 的效果
创建缓存类 MyCache
public class MyCache {
private static Map<String, Object> cache = new HashMap<>();
public static Object get(String key){
return cache.get(key);
}
public static void set(String key, Object value){
cache.put(key, value);
}
}
创建 C 类,并在构造函数读取 MyCache:
@Component
public class C {
public C(){
System.out.println("name:" + MyCache.get("name"));
}
}
创建 D 类,并在构造函数初始化 MyCache:
@Component
public class D {
public D(){
MyCache.set("name", "fuhb");
}
}
启动程序,这时会输出空的数据:
name:null
这明显不符合我们的需求,因此修改 C 类,增加 @DependsOn 注解
@Component
@DependsOn(value = {
"d" })
public class C {
public C(){
System.out.println("name:" + MyCache.get("name"));
}
}
重新启动程序,正常读取了MyCache的数据,说明D优先于C加载
name:fuhb