2015-06-09 2 views
4

Я использовал afterPropertiesSet() для инициализации свойств класса в весенних бобах. Теперь я вижу, что эта задача может быть выполнена с помощью встроенных в Java статических и нестатических инициализаторов. Что я могу сделать с afterPropertiesSet(), что я не могу с помощью блоков инициализатора?Spring: Почему afterPropertiesSet() InitializingBean необходимо, когда в Java есть статические и нестатические инициализаторы?

+5

Нет, вы не можете этого сделать. Статический блок предназначен только для статического материала и будет вызываться/выполняться при загрузке класса. У вас есть доступ к статическим переменным, а не к переменным экземпляра. 'AfterPropertiesSet' или' @ PostConstruct' - инициализировать конкретный экземпляр объекта, а не класс. –

+0

@ M.Deinum, который вы комментируете, квалифицируется как ответ. Вы можете опубликовать его. –

+0

@ M.Deinum, когда вы отправляете свой ответ, стоит обратить внимание, когда конструктор классов может и не может быть использован для достижения той же цели. –

ответ

20

Учитывая следующий класс

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.

+3

Тщательный ответ _and_ cogent - теперь вы что-то не видите каждый день. –

+0

Могу ли я использовать 'MyService (Dep1 dep1, Необязательный dep2Optional)' как часть конструктора и вообще избегать '@ PostConstruct'? –

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