[英]Spring Bean is not autowired
我從abstract
類擴展了Spring bean DefaultConfigurationService
初始化的問題。 我完全被困住了。
類hiearchy如下:
public interface ConfigurationService {
TaxPayer getTaxPayer();
}
提到該類對於需要初始化的服務很有用:
public abstract class BaseInitializationAwareService {
private boolean initialized = false;
public abstract void initialize();
protected void checkInitialization() {
if (!initialized) {
initialize();
}
}
protected void setInitialized() {
this.initialized = true;
}
}
此類充當配置服務的基類。
public abstract class BaseConfigurationService extends BaseInitializationAwareService implements ConfigurationService {
}
使用此bean作為配置服務,這是一個問題:
public class DefaultConfigurationService extends BaseConfigurationService {
private TaxPayerService taxPayerService;
@Autowired
public void setTaxPayerService(TaxPayerService taxPayerService) {
Assert.notNull(taxPayerService);
this.taxPayerService = taxPayerService;
}
public void initialize() {
Optional<TaxPayer> dbtaxPayer = taxPayerService.getActiveTaxPayer();
if (!dbtaxPayer.isPresent()) {
throw new IllegalStateException("Tax payer setting not found!");
}
this.taxPayer = dbtaxPayer.get();
setInitialized();
}
// the rest omitted...
}
當我創建DefaultConfigurationService
bean時:
@Bean
public BaseConfigurationService configurationService() {
DefaultConfigurationService configurationService = new DefaultConfigurationService();
configurationService.initialize();
return configurationService;
}
那么DefaultConfigurationService
taxPayerService
似乎沒有自動裝配。
是否可以將DefaultConfigurationService
從抽象類擴展而來?
TaxPayer服務bean:
@Bean
public TaxPayerService taxPayerService() {
DatabaseTaxPayerService taxPayer = new DatabaseTaxPayerService();
return taxPayer;
}
這個bean可能永遠不會初始化 ...
多數民眾贊成在一個例外:
org.springframework.beans.factory.UnsatisfiedDependencyException:創建名稱為'webSecurityConfig.ApiSecurity'的bean時出錯:通過方法'setContentNegotationStrategy'參數0表示的不滿足的依賴關系; 嵌套的異常是org.springframework.beans.factory.UnsatisfiedDependencyException:創建名稱為“ org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration”的bean時出錯:通過方法“ setConfigurers”參數0表示的依賴關系未滿足; 嵌套的異常是org.springframework.beans.factory.UnsatisfiedDependencyException:創建名稱為“ passwordRecoverController”的bean時出錯:通過方法“ setUserService”參數0表示的不滿足的依賴關系; 嵌套的異常是org.springframework.beans.factory.UnsatisfiedDependencyException:創建名稱為'defaultUserService'的bean時出錯:通過方法'setNotificationService'參數0表示的不滿足的依賴關系; 嵌套的異常是org.springframework.beans.factory.UnsatisfiedDependencyException:創建名稱為“ notificationService”的bean時出錯:通過方法“ setConfigurationService”參數0表示的不滿足的依賴關系; 嵌套的異常是org.springframework.beans.factory.BeanCreationException:創建在類路徑資源[com.example.config / AppConfig.class]中定義的名稱為'configurationService'的bean時出錯:通過工廠方法實例化Bean失敗; 嵌套的異常是org.springframework.beans.BeanInstantiationException:無法實例化[com.example.services.BaseConfigurationService]:工廠方法'configurationService'引發了異常; 嵌套的異常是java.lang.NullPointerException
例如,需要BaseConfigurationService
bean:
public class EmailNotificationService extends BaseService implements NotificationService {
private BaseConfigurationService configurationService;
@Autowired
public void setConfigurationService(BaseConfigurationService configurationService) {
Assert.notNull(configurationService);
this.configurationService = configurationService;
}
// the rest omitted...
}
#update 1
具有對另一個bean的內部依賴性的Bean初始化示例:
@Bean
public TransactionDataService transactionDataService() {
return new DefaultTransactionDataService();
}
和DefaultTransactionDataService
:
public class DefaultTransactionDataService implements TransactionDataService {
private PrivateKeyService privateKeyService;
@Autowired
public void setPrivateKeyService(PrivateKeyService privateKeyService) {
Assert.notNull(privateKeyService);
this.privateKeyService = privateKeyService;
}
}
和bean依賴
@Bean
public PrivateKeyService privateKeyService() {
return new DefaultPrivateKeyAwareService();
}
它起作用 。
這與您向Spring發出的有關如何初始化bean的指令有關:
@Bean用於顯式聲明單個bean,而不是像上面那樣讓Spring自動執行。 它使Bean的聲明與類定義脫鈎,並讓您完全按照自己的選擇創建和配置Bean。
因此,當您手動創建類的實例時,還必須手動設置所有類字段。
可以這樣完成:
@Bean
public BaseConfigurationService configurationService() {
DefaultConfigurationService configurationService = new DefaultConfigurationService();
configurationService.setTaxPayerService(taxPayerService());
configurationService.initialize();
return configurationService;
}
或直接將依賴關系移至構造函數,因此DefaultConfigurationService
依賴關系將更加明顯:
@Bean
public BaseConfigurationService configurationService() {
DefaultConfigurationService configurationService = new DefaultConfigurationService(taxPayerService());
configurationService.initialize();
return configurationService;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.