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 ----
,但还没有运气。
答案 0 :(得分:2)
抽象类在Spring中不是bean。只有SSI
和SoaConfig
类可能是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 ----");
}
}