Как именно работает весенний BeanPostProcessor?



Я изучаю сертификацию Spring Core, и у меня есть некоторые сомнения в том, как Spring обрабатывает жизненный цикл бобы и, в частности, о постпроцессор в зернах.



Так у меня есть эта схема:



enter image description here



Мне довольно ясно, что это значит:



следующие шаги выполняются в Загрузить Определения Бобов фаза:




  • в @Configuration классы обрабатываются и/или @Components are
    сканируется и / или XML-файлы разбираются.


  • определения Bean добавлены в BeanFactory (каждый индексируется под своим идентификатором)


  • специальные BeanFactoryPostProcessor вызванные бобы, он может изменить определение любого Боба (например, для замены значений заполнителя свойств).



затем следующие шаги происходят в этап создания зерен:




  • каждый боб охотно создается по умолчанию (создается в правильном порядке с введенными зависимостями).


  • после инъекции зависимостей каждый компонент проходит постобработку
    фаза, на которой может произойти дальнейшая настройка и инициализация.


  • после обработки зерен полностью инициализирован и готов к использованию (отслеживается его id до тех пор, пока контекст не будет уничтожен)



хорошо, это довольно ясно для меня, и я также знаю, что существует два типа бобовых постпроцессоров которых:




  • инициализаторов: инициализируйте компонент, если он проинструктирован (т. е. @PostConstruct).


  • и все остальные: что позволяет для дополнительной конфигурации и что может выполняться до или после инициализации шаг



и я публикую этот слайд:



enter image description here



Так что это очень ясно для меня, что делает инициализаторы бобовые постпроцессоры (это методы, аннотированные с @PostContruct аннотации и которые автоматически вызываются сразу после методов setter (поэтому после инъекции зависимостей), и я знаю, что могу использовать для выполнения некоторого пакета инициализации (как заполнить кэш, как и в предыдущем образец.)



но что именно представляет собой другой бобовый постпроцессор? Что мы имеем в виду, когда говорим, что эти шаги выполняются до или после фазы инициализации?



таким образом, мои бобы создаются и его зависимости вводятся, поэтому фаза инициализации завершена (путем выполнения @PostContruct аннотированный метод). Что мы имеем в виду, говоря, что бобовый постпроцессор используется до фазы инициализации? Оно означает, что это происходит перед @PostContruct аннотированное выполнение метода? Означает ли это, что это может произойти до инъекции зависимостей (до этого вызываются методы setter)?



и что именно мы имеем в виду, когда говорим, что она выполняется после шага инициализации. Это означает, что после этого происходит выполнение @PostContruct аннотированный метод, или что?



Я могу легко понять в моей голове, почему я нужна @PostContruct аннотированный метод, но я не могу понять какой-то типичный пример другого типа постпроцессора bean, можете ли вы показать мне какой-то типичный пример, когда используются?

825   3  

3 ответов:

Весна док объясняет млрд пакетов / с при настройка бобов с помощью BeanPostProcessor. Бобы BPP-это особый вид бобов, которые создаются раньше любых других бобов и взаимодействуют с вновь созданными бобами. С помощью этой конструкции Spring дает вам средства для подключения и настройки поведения жизненного цикла просто путем реализации BeanPostProcessor себя.

имея пользовательский BPP, как

public class CustomBeanPostProcessor implements BeanPostProcessor {

    public CustomBeanPostProcessor() {
        System.out.println("0. Spring calls constructor");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println(bean.getClass() + "  " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println(bean.getClass() + "  " + beanName);
        return bean;
    }
}

будет вызван и распечатан класс и имя компонента для каждого создан в зернах.

чтобы понять, как метод соответствует жизненному циклу компонента, и когда именно метод вызывается, проверьте docs

postProcessBeforeInitialization (объект bean, строка beanName) применить этот BeanPostProcessor для данного нового экземпляра bean перед любым Бобом обратные вызовы инициализации (например, Initializingbean's afterPropertiesSet или пользовательский init-метод).

postProcessAfterInitialization (объект bean, строка beanName) применить этот BeanPostProcessor для данного нового экземпляра компонента после любого компонента обратные вызовы инициализации (например, Initializingbean's afterPropertiesSet или пользовательский init-метод).

важно также, что

Боб уже будет заполнен значениями свойств.

ибо что касается отношения с @PostConstruct обратите внимание, что эта аннотация является удобным способом объявления postProcessAfterInitialization метод, и весна становится известно об этом, когда вы либо по региструCommonAnnotationBeanPostProcessor или указать <context:annotation-config /> в файле конфигурации bean. Будь то @PostConstruct метод будет выполняться до или после любого другого postProcessAfterInitialization зависит от order свойства

вы можете настроить несколько экземпляров BeanPostProcessor, и вы можете контролируйте порядок, в котором эти BeanPostProcessors выполняют, устанавливая порядок свойство.

типичный пример для постпроцессора bean-это когда вы хотите обернуть исходный bean в экземпляр прокси, например, при использовании @Transactional Примечание.

постпроцессор bean будет передан исходному экземпляру bean, он может вызывать любые методы на цели, но он также возвращает фактический экземпляр bean, который должен быть привязан в контексте приложения, что означает, что он может фактически вернуть любой объект, который он хочет. Типичный сценарий, когда это полезно когда постпроцессор bean обертывает цель в экземпляре прокси. Все вызовы компонента, связанного в контексте приложения, будут проходить через прокси-сервер, а затем прокси-сервер будет выполнять некоторую магию до и/или после вызовов целевого компонента, например AOP или управление транзакциями.

разница составляет BeanPostProcessor подключится к инициализации контекста, а затем вызовет postProcessBeforeInitialization и postProcessAfterInitialization для всех определенных зерен.

но @PostConstruct просто используется для конкретного класса, который вы хотите настроить создание компонента после конструктора или метода set.

Comments

    Ничего не найдено.