簡體   English   中英

Spring Bean未自動接線

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM