Spring IoC контейнер: точки расширения контейнера, пример использования BeanPostProcessor
Этот пример иллюстрирует основное использование BeanPostProcessor. В этом примере показана пользовательская реализация BeanPostProcessor, которая вызывает метод toString() каждого компонента при его создании контейнером и выводит полученную строку в системную консоль.
В следующем листинге показано определение пользовательского класса реализации BeanPostProcessor:
Java
package scripting;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {
// просто возвращаем экземпляр объекта как есть
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean; // мы могли бы потенциально вернуть любую ссылку на объект здесь...
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("Bean '" + beanName + "' created : " + bean.toString());
return bean;
}
}
Kotlin
import org.springframework.beans.factory.config.BeanPostProcessor
class InstantiationTracingBeanPostProcessor : BeanPostProcessor {
// просто возвращаем экземпляр объекта как есть
override fun postProcessBeforeInitialization(bean: Any, beanName: String): Any? {
return bean // мы могли бы потенциально вернуть любую ссылку на объект здесь...
}
override fun postProcessAfterInitialization(bean: Any, beanName: String): Any? {
println("Bean '$beanName' created : $bean")
return bean
}
}
Следующий элемент beans использует InstantiationTracingBeanPostProcessor:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/lang
https://www.springframework.org/schema/lang/spring-lang.xsd">
<lang:groovy id="messenger"
script-source="classpath:org/springframework/scripting/groovy/Messenger.groovy">
<lang:property name="message" value="Fiona Apple Is Just So Dreamy."/>
</lang:groovy>
<!--
когда описывается вышеупомянутый компонент (messenger),
эта пользовательская реализация BeanPostProcessor выведет факт на системную консоль
-->
<bean class="scripting.InstantiationTracingBeanPostProcessor"/>
</beans>
Обратите внимание, что InstantiationTracingBeanPostProcessor просто определяется. У него даже нет имени, и, поскольку он является компонентом, он может быть внедрен в зависимость, как и любой другой компонент. (В предыдущей конфигурации также определяется компонент, поддерживаемый скриптом Groovy.)
Следующее Java-приложение выполняет предыдущий код и конфигурацию:
Java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scripting.Messenger;
public final class Boot {
public static void main(final String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("scripting/beans.xml");
Messenger messenger = ctx.getBean("messenger", Messenger.class);
System.out.println(messenger);
}
}
Kotlin
import org.springframework.beans.factory.getBean
fun main() {
val ctx = ClassPathXmlApplicationContext("scripting/beans.xml")
val messenger = ctx.getBean<Messenger>("messenger")
println(messenger)
}
Вывод предыдущего приложения выглядит следующим образом:
Bean 'messenger' created : org.springframework.scripting.groovy.GroovyMessenger@272961
org.springframework.scripting.groovy.GroovyMessenger@272961
Читайте также:
- Spring IoC контейнер: точки расширения контейнера, BeanPostProcessor
- Spring IoC контейнер: настройка бинов, обратные вызовы при запуске и завершении работы
- Spring IoC контейнер: наследование определения бина
Комментарии
Отправить комментарий