2015-10-03 2 views
0

Последующие to this questionПочему эти формы Autowire работать в @Configuration

Я также попытался это, но она взрывается с не имея noargs конструктор (вы можете сделать это с помощью услуг/контроллеры/компонентов в настоящее время , так почему она не работает здесь?)

@Configuration 
class MyConfig { 

    @Autowired 
    MyConfig(final ObjectMapper mapper) { 
     ... 
    } 
} 

и все это работает

@Configuration // or @Service or some bean 
class SomeClass ... { 

    @Autowired 
    private ObjectMapper objectMapper; 

    @PostConstruct 
    private void configureObjectMapper() { 
     objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
    } 

} 

почему не @Configuration работает, как и другие весенние управляемые классы?

+0

Пожалуйста, покажите нам, как вы используете конфигурацию. Мекве. –

+0

@SotiriosDelimanolis что? связанный вопрос содержал больше информации ... но они «@ Конфигурация», они автоматически загружены, не имеют прямого использования. Spring Spring и Spring MVC используют 'ObjectMapper'. – xenoterracide

+0

OP, обратите внимание, что вы пропустили имя аннотации. – chrylis

ответ

4

Я не признаю ваш первый пример вообще и понятия не имею, где он будет работы.

Второй пример, инсталляция конструктора, не работает специально для классов конфигурации, потому что Spring делает значительное количество магии для анализа и решения графика зависимостей, прежде чем он начнет строить бобы. Классы конфигурации на самом деле проксированы, так что их методы @Bean могут самостоятельно выполнять вызовы и получать экземпляры singleton (или независимо от того, что подходит для этой области). Поскольку класс конфигурации может предоставлять компоненты, от которых сам зависит, Spring требует конструктора no-arg, чтобы он мог создавать экземпляр части за раз.

Мой предпочтительный вариант - использовать параметр injection в моих методах @Bean, который не требует специальной аннотации.

+0

первая - это форма инъекции «setter», хотя я ничего не настраивал. обычно при построении компонента, весна будет вызывать сеттеры, аннотированные с помощью @Autowired, более масштабируемым, чем инъекция конструктора, но не нарушает инкапсуляцию, как это делает инъекция поля. Хотя, возможно, есть больше, чтобы вводить инъекцию, чем то, что я делаю. – xenoterracide

+0

Единственная проблема с '@ Bean' (хотя), может быть, я тоже ничего не понимаю об этом, я просто настраиваю существующий Bean здесь, а не возвращаю. Хотя, возможно, '@ Bean' не нужно ничего возвращать ...? – xenoterracide

+0

@xenoterracide Это не сеттер. То, о чем вы, возможно, думаете, - это некоторые классы конфигураторов, которые реализуют интерфейсы для обработки после обработки. У них нет специализированных аннотаций, поскольку они реализуют конкретные методы. – chrylis

Смежные вопросы