Spring Boot:实例化的顺序

时间:2018-02-09 09:16:59

标签: java spring spring-boot

Spring如何决定首先实例化哪个类? 抽象类是否先于休息?

print genre_dict
print(genre_dict)   # for those using Python 3

输出

public abstract class GenericService {
    @Autowired
    SoaConfig soaConfig;
    public GenericService() {
        System.out.println("----- hi-----"+soaConfig);
    }
}

public class SoaConfig  {
    SoaConfig() {
        System.out.println("\n---- soa config ----");
    }
}

public class SSI extends GenericService {
   public SSI() {
     System.out.println("---- SSI ----");
   }
}

我如何制作,我的依赖应该始终首先实例化? 我试过了----- hi-----null ---- SSI ---- ---- soa config ---- ,但还没有运气。

2 个答案:

答案 0 :(得分:2)

抽象类在Spring中不是bean。只有SSISoaConfig类可能是bean。所以你只能指定它们的顺序。

  

抽象类是否先于休息?

确实,这与Spring没有任何关系。这是一个Java概念 构造函数必须作为其父构造函数的第一个语句调用 因此,当SSI由Spring实例化时,首先调用GenericService构造函数。

关于你的问题,你必须要知道,对于一个类没有arg构造函数的bean,在构造函数实例化之后会对字段或setter进行注入。所以这里:

    System.out.println("----- hi-----"+soaConfig);

soaConfig只能是null

作为@Order@Priority的替代方案,您可以声明SoaConfig  依赖项需要作为构造函数中的参数。 通过这种方式,Spring将直接在构造函数调用中注入SoaConfig bean。

public abstract class GenericService {   
    SoaConfig soaConfig;
    public GenericService(SoaConfig soaConfig) {
       System.out.println("----- hi-----"+soaConfig);
    }
}

public class SSI extends GenericService {
   public SSI(SoaConfig soaConfig) {
      super(soaConfig);
      System.out.println("---- SSI ----");
   }
}

答案 1 :(得分:0)

尝试将Autowired对象修改为构造函数的参数:

public abstract class GenericService {
    @Autowired
    public GenericService(SoaConfig soaConfig) {
        System.out.println("----- hi-----"+soaConfig);
    }
}

@Configuration
public class SoaConfig  {
    SoaConfig() {
        System.out.println("\n---- soa config ----");
    }
}

@Configuration
public class SSI extends GenericService {
   public SSI(SoapConfig soapConfig) {
     System.out.println("---- SSI ----");
   }
}