Имам следния клас java:
package configuration;
import common.config.ConfigurationService;
public class AppConfig {
private ConfigurationService configurationService;
public AppConfig(ConfigurationService configurationService){
this.configurationService = configurationService;
}
също
public class ConfigurationServiceImpl
implements ConfigurationService, Runnable
{...
и контекстният файл на приложението е както следва:
<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>
по време на инициализация получавам следната грешка и бобът ми не се инициализира:
Причинено от: org.springframework.beans.factory.BeanCreationException: Грешка при създаването на bean с име "appConfig", дефинирано в ресурса на пътя на клас [conf / applicationContext.xml]: 1 конструкторски аргументи са посочени, но в bean "appConfig" не е намерен съвпадащ конструктор (намек: посочете аргументи за индекс и / или тип за прости параметри за да се избегнат неясноти)
Докато Spring инжекцията работи, ако променя кода на клас java, както следва:
package configuration;
import common.config.ConfigurationServiceImpl;
public class AppConfig {
private ConfigurationServiceImpl configurationService;
public AppConfig(ConfigurationServiceImpl configurationService){
this.configurationService = configurationService;
}
Отговори:
2 за отговор № 1На първо място, трябва да знаете това Пролетта не поддържа интерфейсно инжектиране, и затова кодът в първия ви случай не работи, защото вие предавате ConfigurationService, който е интерфейс, както конструкторът аргументира.
Във втория случай го правите правилно, като предавате класа на изпълнение на ConfigurationService и го вземате като аргумент на конструктора.
1 за отговор № 2
Само като го гледам, името на пакета заAppConfig в конфигурацията Spring не съвпада с пакета, деклариран в източника на Java. Имате "common.config" срещу "конфигурация". Може да се окаже, че текстът за грешка е подвеждащ, че причината конструктора да не бъде намерена е, че самият клас не е намерен.