Spring: примените @Autowired к свойству, чтобы исключить установщик

Насколько я понимаю, аннотация @Autowired применяется к свойству bean-компонента, так это то, что, делая это, мы можем исключить метод установки. Это кажется правильным, когда мы выбираем конфигурацию на основе аннотаций: мы просто создаем bean-компонент с аннотацией @Component и аннотируем @Autowired к его интересующему свойству.

Однако мне не удалось сделать то же самое, когда я тестировал идею с использованием конфигурации на основе xml.

Вот что я поместил в класс bean:

@Autowired
private String message2;

public String getMessage2() {
    return message2;
}

В xml-файле:

<bean id="testBean" class="TestBean">
    <property name="message2" value="Hello world!"/>
</bean> 

среда IDE пожаловалась «не может разрешить свойство» и не смогла скомпилировать. Может быть, использование @Autowired с конфигурацией xml является странным браком, который запрещен?

Кто-нибудь хочет помочь мне с этим, может быть, глупым вопросом?


person J.E.Y    schedule 22.02.2018    source источник


Ответы (1)


Если вам не нужен установщик, избавьтесь от элемента <property> в определении компонента TestBean. Это property требует, чтобы установщик был доступен для установки свойства. Поскольку он отсутствует, если вы действительно попытаетесь загрузить конфигурацию XML, например, с ClassPathXmlApplicationContext, вы получите эту ошибку.

Причина: org.springframework.beans.NotWritablePropertyException: Недопустимое свойство message2 класса компонента [org.example.TestBean]: Свойство компонента message2 недоступно для записи или имеет недопустимый метод установки. Соответствует ли тип параметра установщика типу возвращаемого значения геттера?

После удаления <property> объявите соответствующий bean-компонент для внедрения

<bean id="message2" class="java.lang.String">
  <constructor-arg value="Helllo world!"/>
</bean>

Вам также понадобится

<context:annotation-config />

чтобы зарегистрировать AutowiredAnnotationBeanPostProcessor, который обрабатывает @Autowired.


Обратите внимание, что объявление bean-компонента String неудобно. Вам лучше будет использовать <property> или какой-либо другой механизм разрешения свойств, который извлекает значение из файла конфигурации и присваивает его через аннотированное поле @Value.

@Value("${config.message2}")
private String message2;
person Savior    schedule 22.02.2018
comment
большое спасибо за ответ. Код пахнет (и не будет работать, как указано), но я просто экспериментировал, чтобы проверить некоторые идеи, такие как 1) как конфигурация xml работает с @Autowired и 2) что это означает, исключая сеттеры при использовании autowired для свойства. - person J.E.Y; 22.02.2018
comment
@ J.E.Y Да, я изначально неправильно понял ваш вопрос, и мне пришлось отредактировать свой ответ. Но да, дело в том, что если вы удалите сеттер, вы не сможете использовать <property>. - person Savior; 22.02.2018