Каков весенний способ автопроводки заводских инстансов? - PullRequest
4 голосов
/ 06 июля 2011

У меня есть контроллер, который должен создавать экземпляры, зависящие от версии (в настоящее время не реализовано).

@Controller
public class ReportController {

    @Autowired
    private ReportCompFactory       reportCompFactory;

         public ModelAndView getReport() {
            I_Report report = reportCompFactory.getObject();
                      ^^^^^<- no autowiring in this instance 
         }
     ...
}

Фабрика выглядит так:

@Component
public class ReportCompFactory implements FactoryBean<I_Report> {

    @Override
    public I_Report getObject() throws BeansException {
        return new ReportComp();
    }

    @Override
    public Class<?> getObjectType() {
        return I_Report.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

Поля созданных экземпляров (аннотированные @Autowired) не установлены. Что я должен делать, это FactoryBean правильный интерфейс для реализации?

Я бы предпочел решение, не включающее xml-конфигурации.

Сам компонент:

    ReportComp implements I_Report {

        @Autowired
        private ReportDao           reportDao;
                                     ^^^^^^^<- not set after creation
    ...
    }

}

1 Ответ

8 голосов
/ 06 июля 2011

Spring не выполняет автоматическое подключение, если вы создаете свои объекты. Вот несколько вариантов

  • определяет bean-компонент для области действия prototype - это сделает фабрику избыточной (это применимо, если вы просто хотите создать экземпляр на фабрике)
  • введите ReportDao на заводе и установите его на ReportComp с помощью установщика
  • введите ApplicationContext на заводе и сделайте ctx.getAutowireCapableBeanFactory().autowireBean(instance)
...