@Configuration Spring3 не может @ Inject компонентно-сканированных bean-компонентов - PullRequest
0 голосов
/ 16 апреля 2011

Это мой app.xml:

<context:component-scan base-package="destiny.web" />
<context:annotation-config/>

И есть Dao (интерфейс) и DaoImpl (помечены @Repository) внутри пакета destiny.web.

Существует еще один класс destiny.web.AppConfig в Spring3:

@Configuration
public class AppConfig
{
  @Inject
  private Dao daoImpl

  public AppConfig()
  {
    System.out.println("dao = " + daoImpl);
  }
}

Он печатает 'null', почему?

Я уверен, что все эти компоненты / конфигурация / репозитории сканируются.Но, похоже, @Configuration не знает других отсканированных компонентов.Я что-то пропустил?

Я пытаюсь решить это с помощью @ImportResource:

@Configuration
@ImportResource("classpath:app.xml")
public class AppConfig

Но кажется, что это вызывает циклическое сканирование bean-компонентов и выдает это исключение:

{main} org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Only one AsyncAnnotationBeanPostProcessor may exist within the context.
Offending resource: class path resource [app.xml]

Как это решить?

Спасибо.

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Пружина будет invoke constructor firstly before inject / autowiring другим компонентом.поэтому ваш дао будет нулевым, пока вы печатаете в конструкторе, потому что dao still not injected yet.

Попробуйте создать тестовое приложение для вашего configapp.

public class Main {
    public static void main(String[] args) {
        ApplicationContext context =
            new ClassPathXmlApplicationContext("stackoverflow.xml");

        AppConfig appConfig = context.getBean(AppConfig.class);
        appConfig.getConfig("smtp.host");
    }
}
0 голосов
/ 16 апреля 2011

Вы пробовали также с аннотацией @Autowired вместо @Inject?

...