Подтвердить что ты не робот

Spring Autowiring работает только с интерфейсом

Я новичок в структуре spring и наткнулся на следующую проблему.

У меня есть интерфейс ClassA, который реализуется с помощью классифицированных ClassA1 и ClassA2.

У меня есть следующее определение bean, добавленное в applicationContext.xml

<bean id="class1" class="com.abc.ClassA1" />
<bean id="class2" class="com.abc.ClassA2" />

Я хотел бы Autowire оба класса реализации, как показано ниже.

@Autowired
private ClassA1 classA1;

@Autowired
private ClassA2 classA2;

Приведенный выше код бросает ошибку как

Не удалось autowrite в поле: com.abc.ClassA1 com.abc.SomeClass.classA1; вложенное исключение org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет соответствия bean типа [Com.abc.ClassA1]

Но если я изменю autwiring на интерфейс, как показано ниже:

@Autowired
ClassA classA1;

Затем ClassA1 автоматически передается переменной. Я не знаю, как я могу autwire переменную для ClassA2.

4b9b3361

Ответ 1

Я попробовал несколько способов устранить эту проблему, но я получил ее работу следующим образом.

@Autowired
private ClassA classA1;

@Autowired
private ClassA classA2;

В контексте приложения я определил bean, как показано ниже:

<bean id="classA1" class="com.abc.ClassA1" autowire="byName" />
<bean id="classA2" class="com.abc.ClassA2" autowire="byName" />

Ответ 2

По какой-то причине ваши классы проксируются Spring. Там много причин, почему это может произойти. Например, если вы используете JPA или AOP, исходный класс проксируется.

Если класс реализует интерфейс, прокси означает Dynamic Proxy. Таким образом, в среде разработки создается новый класс, который реализует интерфейсы, но не наследует от исходного класса. Поэтому автоустановка к исходному классу не работает.

Ответ 3

Если ваши объекты проксируются прокси-серверами JDK, тогда их интерфейс должен быть указан. Вы можете создавать прокси по конкретному классу с помощью CGLIB (по пути classpath) и proxy-target-class="true" в конфигурации вашего aop (в applicationContext.xml)

Ответ 4

Вы можете использовать аннотацию @Qualifier:

@Autowired
@Qualifier("class1")
ClassA classA1;

@Autowired
@Qualifier("class2")
ClassA classA2;

Ссылка: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers

или аннотации @Resource:

@Resource(name="class1")
ClassA classA1;

@Resource(name="class2")
ClassA classA2;

Ссылка: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-resource-annotation

Ответ 5

У меня есть аналогичная проблема с абстрактным сервисом Autowiring. Вы можете использовать без проблемного кода следующим образом:

@Autowired
@Qualifier("classA1")
private ClassA1 classA1;

@Autowired
@Qualifier("classA2")
private ClassA2 classA2;

Это будет работать, только если вы объявите свой bean следующим образом

<bean id="class1" class="com.abc.ClassA1" />

Или как это

@Component("classA1")
public class ClassA1 {
...
}

Ответ 6

Из небольшого числа, которое я видел до сих пор, это не похоже на ограничение, относящееся к типу класса, который можно было бы отметить как @Autowired.

Не относится к проблеме, но эта статья ссылается на саму ситуацию