Spring @Autowired конструктор не дает конструктор по умолчанию найдено - PullRequest
4 голосов
/ 01 декабря 2011

Здесь немного странное поведение Spring 3.0.

package com.service.schedule;

import org.springframework.stereotype.Component;

@Component("outroJob")
public class OutroJob {

    public void printMe() {
        System.out.println("running...");
    }

}

и

package com.service.schedule;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;

@Component("testeAutowired")
public class TesteAutowired {

    @Autowired
    public TesteAutowired(OutroJob outroJob) {
        outroJob.printMe();
    }

    public static void main(String[] args) {
        ClassPathResource res = new ClassPathResource("applicationContext.xml");
        XmlBeanFactory ctx = new XmlBeanFactory(res);

        OutroJob outroJob = (OutroJob) ctx.getBean("outroJob");
        outroJob.printMe(); // gives: running...

        ctx.getBean("testeAutowired");
    }
}

Ни один из этих компонентов не объявлен в applicationContext.xml

Итак, строка outroJob.printMe ();работает нормально ... печатает "выполняется ..."

Но когда я пытаюсь получить бин "testeAutowired", он говорит:

Не удалось создать экземпляр класса бина [com.service.schedule.TesteAutowired]: конструктор по умолчанию не найден;вложенным исключением является java.lang.NoSuchMethodException: com.service.schedule.TesteAutowired.

Вопрос: почему, если Spring обнаружил bean-компонент outroJob, он не подключается автоматически к конструктору TesteAutowired?

Кажется очевидным, что он должен делать ...

Ответы [ 4 ]

1 голос
/ 01 декабря 2011

Попробуйте использовать ApplicationContext вместо XmlBeanFactory.XmlBeanFactory не выполняет постобработку аннотаций, т.е. не использует AutowiredAnnotationBeanPostProcessor, который объясняет поведение, которое вы испытываете.

Вот еще несколько объяснений

0 голосов
/ 01 января 2017

Я получаю то же сообщение об ошибке, но у меня другая проблема. Я использовал конфигурацию XML и поместил @Autowired в конструктор класса.

Я исправил эту проблему, включив конфигурацию на основе аннотаций в моем файле конфигурации XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <context:annotation-config/>
0 голосов
/ 03 декабря 2011

Создайте интерфейс для компонента и попытайтесь выполнить автоматическое подключение интерфейса и обозначить класс с помощью автоматического проводного конструктора.

0 голосов
/ 01 декабря 2011

Попробуйте использовать

@Autowired(required=true)
public TesteAutowired(OutroJob outroJob) {
    outroJob.printMe();
}

Это должно заставить Spring использовать этот конструктор.В противном случае он строит список конструкторов и выбирает лучшего кандидата.Очевидно, он действительно хочет использовать конструктор по умолчанию в качестве кандидата.

Ссылка: http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.html

...