Что означает postProcessBeforeInitialization в Spring BeanPostProcessor?

1

В файле XML

<bean id="triangle" class="com.company.aop.model.Triangle">
    <property name="name" value="myTriangle"></property>
</bean>

<bean class="com.company.aop.DisplayNameBeanPostProcessor"></bean>

В классе DisplayNameBeanPostProcessor.java

public class DisplayNameBeanPostProcessor implements BeanPostProcessor{

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        // TODO Auto-generated method stub
        if(bean instanceof Triangle) {
//          System.out.println("Tr "+(((Triangle) bean).getName().toString()));
            System.out.println("I am after intialisation");
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        // TODO Auto-generated method stub
        if(bean instanceof Triangle) {
            System.out.println("Tr "+(((Triangle) bean).getName().toString()));
        }
        return bean;
    }

}

Теперь, когда я запускаю этот код, он переходит к методу postProcessBeforeInitialization() с аргументом bean и beanName и выводит сообщение "myTriangle". Этот компонент имеет в своем случае информацию, такую как поле имени, значение myTriangle. Но подпись метода говорит, что перед инициализацией это то, что этот компонент был передан в него, если он еще не был инициализирован? И в чем разница между

public Object postProcessAfterInitialization(Object bean, String beanName) 

а также

public Object postProcessBeforeInitialization(Object bean, String beanName)

Почему эта строка

System.out.println("Tr "+(((Triangle) bean).getName().toString()));

печатает имя в методе postProcessBeforeInitialization, если метод был вызван до инициализации?

Теги:
spring
spring-mvc
javabeans

2 ответа

5
Лучший ответ

Вы можете обратиться к разделу 5.8.1 весенних документов здесь. Ключевым моментом здесь является то, что "postProcessBeforeInitialization" следует читать как "postProcessBeforeInitializationCallback" и "postProcessAfterInitialization" следует читать как "postProcessAfterInitializationCallback". Таким образом, это pre и post processeors после обратного вызова инициализации до/после запуска с помощью контейнера Spring в компоненте. Это то, что передается в документации этих методов здесь тоже.

Объект postProcessBeforeInitialization (Object bean, String beanName) выбрасывает BeansException

Примените этот BeanPostProcessor к данному новому экземпляру bean перед любыми обратными вызовами инициализации bean-компонентов (например, AfterPropertiesSet InitializingBean или настраиваемый метод init). Боб уже будет заполнен значениями свойств.

Обратите внимание, что это говорит о том, что "Боб уже будет заполнен значениями свойств". по аналогии

Объект postProcessAfterInitialization (Object bean, String beanName) бросает BeansException

Примените этот BeanPostProcessor к данному новому экземпляру bean после любых обратных вызовов инициализации bean-компонентов (например, AfterPropertiesSet InitializingBean или настраиваемого метода init). Боб уже будет заполнен значениями свойств.

  • 0
    Теперь в приведенном ниже случае beanFactory передается в аргументе, тогда как имя функции - postProcessBeanFactory, и это означает, что фабрика бинов должна быть инициализирована после этого постпроцессора? public class DisplayNameBeanPostProcessor implements BeanFactoryPostProcessor{ @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { }}
2

BeanPostProcessor beans - это особый вид бобов, которые создаются перед любыми другими компонентами и взаимодействуют с вновь созданными компонентами. postProcessBeforeInitialization и postProcessAfterInitialization применяются к любому другому компоненту, созданному весной.

Но подпись метода говорит, что перед инициализацией это то, что этот компонент был передан в него, если он еще не был инициализирован?

Инициализация здесь относится к вызову метода init вашего треугольного компонента, поэтому предыдущие и последующие вызовы завершают вызов методом init из компонента. До этого уже выполняются инъекции конструктора и сеттера, поэтому у компонента есть фактические значения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню