В файле 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, если метод был вызван до инициализации?
Вы можете обратиться к разделу 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). Боб уже будет заполнен значениями свойств.
BeanPostProcessor beans - это особый вид бобов, которые создаются перед любыми другими компонентами и взаимодействуют с вновь созданными компонентами. postProcessBeforeInitialization
и postProcessAfterInitialization
применяются к любому другому компоненту, созданному весной.
Но подпись метода говорит, что перед инициализацией это то, что этот компонент был передан в него, если он еще не был инициализирован?
Инициализация здесь относится к вызову метода init вашего треугольного компонента, поэтому предыдущие и последующие вызовы завершают вызов методом init из компонента. До этого уже выполняются инъекции конструктора и сеттера, поэтому у компонента есть фактические значения.
public class DisplayNameBeanPostProcessor implements BeanFactoryPostProcessor{
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
}}