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


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки