Сообщения

Показаны сообщения с ярлыком "Container Extension"

Spring IoC контейнер: точки расширения контейнера, настройка логики реализации с помощью FactoryBean

Изображение
Вы можете реализовать интерфейс org.springframework.beans.factory.FactoryBean для объектов, которые сами являются фабриками. Интерфейс FactoryBean - это точка подключения к логике создания контейнера Spring IoC. Если у вас есть сложный код инициализации, который лучше выражен в Java, в отличие от (возможно) многословного объема XML, вы можете создать свой собственный FactoryBean, записать сложную инициализацию внутри этого класса, а затем вставить свой собственный FactoryBean в контейнер. Интерфейс FactoryBean предоставляет три метода: Object getObject(): возвращает экземпляр объекта, который создает эта фабрика. Экземпляр может быть общим, в зависимости от того, возвращает ли эта фабрика синглтоны или прототипы. boolean isSingleton(): возвращает true, если этот FactoryBean возвращает синглтоны или false в противном случае. Class getObjectType(): возвращает тип объекта, возвращаемый методом getObject(), или значение null, если тип заранее не известен. Концепция и интерфейс Fac...

Spring IoC контейнер: точки расширения контейнера, PropertyOverrideConfigurer

Изображение
PropertyOverrideConfigurer, другой постпроцессор фабрики бинов, напоминает PropertySourcesPlaceholderConfigurer , но в отличие от последнего, исходные определения могут иметь значения по умолчанию или вообще не иметь значений для свойств бина. Если в файле переопределенных свойств нет записи для определенного свойства компонента, используется определение контекста по умолчанию. Обратите внимание, что определение компонента не знает о переопределении, поэтому из файла определения XML не сразу видно, что используется конфигуратор переопределения. В случае нескольких экземпляров PropertyOverrideConfigurer, которые определяют разные значения для одного и того же свойства компонента, выигрывает последний из-за механизма переопределения. Строки конфигурации файла свойств имеют следующий формат: beanName.property=value Следующий листинг показывает пример формата: dataSource.driverClassName=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql:mydb Этот файл примера можно использоват...

Spring IoC контейнер: точки расширения контейнера, подстановка имени класса PropertySourcesPlaceholderConfigurer

Изображение
Вы можете использовать PropertySourcesPlaceholderConfigurer для вывода значений свойств из определения компонента в отдельный файл, используя стандартный формат свойств Java. Это позволяет человеку, развертывающему приложение, настраивать свойства среды, такие как URL-адреса и пароли базы данных, без сложности или риска изменения основного файла определения XML или файлов для контейнера. Рассмотрим следующий фрагмент метаданных конфигурации на основе XML, в котором определен источник данных со значениями-заполнителями: <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="locations" value="classpath:com/something/jdbc.properties"/> </bean> <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <p...

Spring IoC контейнер: точки расширения контейнера, BeanFactoryPostProcessor

Изображение
Следующей точкой расширения, на которую мы смотрим, является org.springframework.beans.factory.config.BeanFactoryPostProcessor. Семантика этого интерфейса аналогична семантике BeanPostProcessor , но есть одно существенное отличие: BeanFactoryPostProcessor работает с метаданными конфигурации бина. То есть контейнер IoC Spring позволяет BeanFactoryPostProcessor считывать метаданные конфигурации и, возможно, изменять их до того, как контейнер создаст какие-либо компоненты, кроме экземпляров BeanFactoryPostProcessor. Вы можете настроить несколько экземпляров BeanFactoryPostProcessor и управлять порядком, в котором эти экземпляры BeanFactoryPostProcessor запускаются, установив свойство order. Однако вы можете установить это свойство, только если BeanFactoryPostProcessor реализует интерфейс Ordered. Если вы пишете свой собственный BeanFactoryPostProcessor, вам следует подумать о реализации интерфейса Ordered. Если вы хотите изменить фактические экземпляры компонента (то есть объекты, созда...

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; } }...

Spring IoC контейнер: точки расширения контейнера, BeanPostProcessor

Изображение
Как правило, разработчику приложений не нужно создавать подклассы классов реализации ApplicationContext. Вместо этого контейнер Spring IoC можно расширить, подключив реализации специальных интеграционных интерфейсов. Настройка Beans с помощью BeanPostProcessor Интерфейс BeanPostProcessor определяет методы обратного вызова, которые вы можете реализовать, чтобы предоставить собственную (или переопределить контейнерную логику) реализацию, логику разрешения зависимостей и т. д. Если вы хотите реализовать некоторую пользовательскую логику после того, как контейнер Spring завершит создание экземпляра, настройку и инициализацию компонента, вы можете подключить одну или несколько пользовательских реализаций BeanPostProcessor. Вы можете настроить несколько экземпляров BeanPostProcessor и управлять порядком, в котором эти экземпляры BeanPostProcessor выполняются, установив свойство order. Вы можете установить это свойство, только если BeanPostProcessor реализует интерфейс Ordered. Если вы пи...