Ответ 1
Это может быть неприемлемо для вас, но иногда я использую runtime bean отражение для проверки согласованности кода.
Для вашего случая использования я сначала сделаю все мои beans использование constructor
на основе инъекций и сделаю все поля участников final
. Я считаю, что у findbugs даже есть некоторые неизменные шашки bean.
Во-вторых, чтобы выполнить последовательность кода для вашего варианта использования, я бы использовал либо Spring BeanPostProcessor
, либо просто класс, который реализует ApplicationContextAware
, а затем проходит ApplicationContext. Теперь вы просто проверяете beans, которые загружаются в контексте приложения, которое является вашим (просто проверьте имя пакета класса beans), чтобы убедиться, что все поля final
. Да, вам понадобится более слабый менеджер безопасности или включите вашу политику безопасности, чтобы разрешить отображение частной переменной, но для большинства это не проблема, особенно если вы уже используете что-то вроде спящего режима.
Если есть поле, которое не является окончательным, то есть неверный код, вы просто бросаете исключение, и приложение Spring не запускается.
Для различных исключений из правила вы можете использовать пользовательские аннотации для полей, которые не обязательно должны быть окончательными, или классов, которые должны игнорировать правило.
Вы можете быть обеспокоены производительностью или тем, что встраивание конструктора Spring недостаточно мощное, но Spring уже делает огромное количество отражений в любом случае при загрузке, а инсталляция на основе конструкторов стала довольно сильной в наши дни, так что вы можете даже введите значения владельца места с помощью @Value(${PROP})
.