Я использовал afterPropertiesSet()
для инициализации свойств класса в весенних бобах. Теперь я вижу, что эта задача может быть выполнена с помощью встроенных в Java статических и нестатических инициализаторов. Что я могу сделать с afterPropertiesSet()
, что я не могу с помощью блоков инициализатора?Spring: Почему afterPropertiesSet() InitializingBean необходимо, когда в Java есть статические и нестатические инициализаторы?
ответ
Учитывая следующий класс
public class MyClass implements InitializingBean {
static { ... } // static initializer
{ ... } // non-static initializer
public void afterPropertiesSet() throws Exception { ... }
}
Инициализатором блок статического выполняется только тогда, когда класс загружается загрузчик классов. В этот момент нет экземпляра этого класса, и вы сможете получить доступ к переменным класса (static
) в этой точке, а не переменным экземпляра.
нестатический блок инициализатора, когда объект сконструирован, но до того, как будут введены какие-либо свойства. Блок нестатического инициализатора фактически копируется в конструктор.
Компилятор Java копирует блоки инициализации в каждый конструктор. Поэтому этот подход может использоваться для совместного использования блока кода между несколькими конструкторами.
Смотрите также Static Initialization Blocks и http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
afterPropertiesSet
или @PostConstruct
аннотированный метод вызывается после того, как экземпляр класса создается и все свойства были установлены. Например, если вы хотите предварительно загрузить некоторые данные, которые могут быть выполнены в этом методе, поскольку все зависимости установлены.
Если у вас есть только обязательные зависимости, вам может быть лучше использовать инсталляцию конструктора и вместо использования InitializingBean
или @PostConstruct
поместить логику инициализации в конструктор. Это будет работать, только если все зависимости будут введены через конструктор, если у вас есть дополнительные зависимости, заданные с помощью методов набора, тогда у вас нет выбора, кроме как использовать @PostConstruct
или InitializingBean
.
Тщательный ответ _and_ cogent - теперь вы что-то не видите каждый день. –
Могу ли я использовать 'MyService (Dep1 dep1, Необязательный
- 1. в Spring Autowired и InitializingBean
- 2. Статические и нестатические в java?
- 3. Статические инициализаторы и статические методы в Java
- 4. Java статические инициализаторы и отражение
- 5. Статические/нестатические вопросы Java
- 6. Статические и нестатические поля
- 7. Статические и нестатические методы
- 8. Spring InitializingBean не работает с КДИ
- 9. Статические инициализаторы
- 10. Акка эквивалент Spring InitializingBean
- 11. Статические инициализаторы против Instance Инициализаторы против конструкторов
- 12. Java - статические инициализаторы в импортированных проектах
- 13. Статические инициализаторы в bcel
- 14. Статические инициализаторы и безопасная публикация
- 15. PHP: Статические и нестатические функции и объекты
- 16. Почему нестатические ссылки на статические переменные компилируются?
- 17. Являются ли статические инициализаторы Java безопасными?
- 18. Статические и нестатические методы в scala
- 19. Нестатические ... статические какие?
- 20. C++: Unimplemented: нестатические Инициализаторы членов данных
- 21. Почему существуют статические и нестатические перегрузки равных в .net?
- 22. Spring MVC Rest API не работает при реализации InitializingBean
- 23. Статические и нестатические функции в приложениях Pebble
- 24. `статические 'и` нестатические` поля для лучшей производительности в java Android
- 25. C++ предупреждение нестатические Инициализаторы элемент данных
- 26. нестатические и статические данные и функции
- 27. Статические инициализаторы и константные переменные Wrapper
- 28. Spring: init-method, PostConstruct, afterPropertiesSet: когда использовать один над другим?
- 29. Статические инициализаторы и синхронизация потоков (.NET)
- 30. Как использовать статические/нестатические функции?
Нет, вы не можете этого сделать. Статический блок предназначен только для статического материала и будет вызываться/выполняться при загрузке класса. У вас есть доступ к статическим переменным, а не к переменным экземпляра. 'AfterPropertiesSet' или' @ PostConstruct' - инициализировать конкретный экземпляр объекта, а не класс. –
@ M.Deinum, который вы комментируете, квалифицируется как ответ. Вы можете опубликовать его. –
@ M.Deinum, когда вы отправляете свой ответ, стоит обратить внимание, когда конструктор классов может и не может быть использован для достижения той же цели. –