Mam następującą klasę Java:
package configuration;
import common.config.ConfigurationService;
public class AppConfig {
private ConfigurationService configurationService;
public AppConfig(ConfigurationService configurationService){
this.configurationService = configurationService;
}
również
public class ConfigurationServiceImpl
implements ConfigurationService, Runnable
{...
a plik kontekstu aplikacji jest następujący:
<bean id="appConfig" class="configuration.AppConfig" scope="prototype">
<constructor-arg ref="configurationService"></constructor-arg>
</bean>
<bean id="configurationService" class="common.config.ConfigurationServiceImpl" scope="singleton" />
<bean id="propertyPlaceholderConfigurer" class="common.config.PropertyPlaceholderConfigurer">
<constructor-arg ref="configurationService" />
<constructor-arg ref="serviceName" />
</bean>
<bean id="serviceName" class="java.lang.String"><constructor-arg value="filter"/></bean>
podczas inicjalizacji pojawia się następujący błąd i moje ziarna nie są inicjowane:
Przyczyna: org.springframework.beans.factory.BeanCreationException: Błąd tworzenia komponentu bean o nazwie „appConfig” zdefiniowany w zasobie ścieżki klasy [conf / applicationContext.xml]: 1 argumentów konstruktora podano, ale nie znaleziono pasującego konstruktora w komponencie bean „appConfig” (wskazówka: podaj argumenty indeksu i / lub wpisz proste parametry aby uniknąć niejednoznaczności typu)
Podczas gdy Spring injection działa, jeśli zmodyfikuję kod klasy Java w następujący sposób:
package configuration;
import common.config.ConfigurationServiceImpl;
public class AppConfig {
private ConfigurationServiceImpl configurationService;
public AppConfig(ConfigurationServiceImpl configurationService){
this.configurationService = configurationService;
}
Odpowiedzi:
2 dla odpowiedzi № 1Po pierwsze musisz to wiedzieć Wiosna nie obsługuje wstrzykiwania interfejsu, i dlatego kod w pierwszym przypadku nie działa, ponieważ przekazujesz ConfigurationService, który jest interfejsem, jak argumentuje konstruktor.
W drugim przypadku robisz to poprawnie, przekazując klasę implementacji ConfigurationService i przyjmując ją jako argument konstruktora.
1 dla odpowiedzi nr 2
Wystarczy spojrzeć na to, nazwa pakietu dlaAppConfig w konfiguracji Spring nie pasuje do pakietu zadeklarowanego w źródle Java. Masz „common.config” kontra „konfiguracja”. Możliwe, że tekst błędu wprowadza w błąd, a przyczyną, dla której nie znaleziono konstruktora, jest to, że nie znaleziono samej klasy.