GrabDuck

Spring framework - словарь Spring

:

Словарь создан для помощи программистам работающим и изучающим Spring Framework. Определения будут касаться часто используемых в работе классов, аннотаций, сервлетов и др.

A

AbstractTransactionalJUnit4SpringContextTests

Позволяет при запуске тестов поднимать application context config. Делается это при помощи аннотации для класса-теста: @ContextConfiguration(locations = { "/applicationContext.xml" }).

ApplicationEvent

Обработка событий в Spring осуществляется через класс ApplicationEvent и интерфейс ApplicationListener. При наступлении события нотифицируются все объекты, реализующие интерфейс ApplicationListener.

AnonymousAuthenticationFilter

Определяет, если нет Authentication объекта в SecurityContextHolder, и заполняет его одним, если необходимо.

C

ContextLoaderListener

Класс ContextLoaderListener отвечает за загрузку контекста Web-приложения, когда оно начинает работать. Контекст Web-приложения совместно используется всеми портлетами в портлет-приложении. Если определение bean-компонента дублируется, определение компонента в контексте портлет-приложения имеет приоритет над контекстом Web-приложения.

Класс ContextLoader пытается прочитать значение параметра Web-контекста contextConfigLocation для поиска месторасположения файла контекста. Если параметр contextConfigLocation не установлен, он использует значение по умолчанию /WEB-INF/applicationContext.xml для загрузки файла контекста.

@ContextConfiguration

Задает конфигурационный файл

@Controller

Указывает, что класс является Spring MVC контроллером, который автоматически регистрируется context:component-scan в web-application-context.xml.

ControllerClassNameHandlerMapping

Реализация org.springframework.web.servlet.HandlerMapping, позволяющая генерировать URL путь от имени класса зарегистрированного как @Controller (контроллер) бин.

Класс берет имя класса и удаляет суффикс 'Controller' и возвращает остальной текст, с низким регистром. Например: WelcomeController -> /welcome*

Controller интерфейс

Лучше всего подходит для отображения read-only данных. Тогда как SimpleFormController класс сделан для обработки форм, если данные вводить не нужно тогда используется AbstractCommandController.

D

data-access-context.xml файл

Его суть - настройка менеджера транзакций (которого мы здесь касаться не будем) и EntityManagerFactory. Давайте посмотрим.

                        
<context:component-scan base-package="org.springbyexample.web.jpa.dao" />
		

context:component-scan - это конфигурационный элемент в пространстве имен "context". Этот элемент говорит Spring сканировать пакет, указанный в base-package и все подпакеты для классов, которые могут содержать аннотацию @Component (в Spring 2.1), @Repository (в Spring 2.0), или @Aspect ( предоставляемый @AspectJ). Если такой класс найден, автоматически такой класс регистрируется как бин в контексте приложения Spring.

В нашем случае есть класс PersonDaoImpl implements PersonDao, от выделен аннотацией @Repository, а над методом setEntityManager( EntityManager em) стоит аннотация @PersistenceContext. Что это означает? Первая аннотация будет найдена context:component-scan и будет создан соответствующий бин. Вторая аннотация означает следующее: в текущем XML файле мы создаем бин с id="EntityManagerFactory", который будет помещен в метод помеченный как @PersistenceContext. Это происходит благодаря инъекции зависимостей.

И так, для управления транзакциями в Spring существует пространство имен tx, в котором определена, в частности, директива tx:annotation-driven, включающая механизм управления транзакциями через аннотации.

DispatcherPortlet

DispatcherPortlet отвечает за обработку каждого клиентского запроса. При получении запроса он ищет, какой класс должен использоваться для обработки этого запроса, затем вызывает его метод handleActionRequest() или handleRenderRequest() в зависимости от фазы обработки запроса. Класс Controller выполняет бизнес-логику и возвращает имя View (представление), которое должно использоваться для визуализации разметки пользователю. Затем DispatcherPortlet передает управление этому View для реального генерирования разметки.

Как можно заметить, DispatcherPortlet является центральным диспетчером, использующимся внутри среды Spring Portlet MVC Framework. Обратите внимание на то, что портлет может определить более одного DispatcherPortlet. При этом каждый из этих портлетов работает в своем собственном пространстве имен, загружая контекст приложения и отображение обработчика.

DispatcherPortlet также отвечает за загрузку контекста приложения (конфигурационного файла Spring) для данного портлета. Сначала он пытается проверить значение параметра инициализации портлета configLocation. Если этот параметр не указан, он берет имя портлета (то есть значение элемента <portlet-name>), добавляет к нему -portlet.xml и пытается загрузить этот файл из папки /WEB-INF. В файле portlet.xml мы не указываем параметр инициализации configLocation.

E

ExceptionTranslationFilter

Обрабатывает любые AccessDeniedException и AuthenticationException выброшенные в цепочке фильтров.

Этот фильтр необходим, потому, что он предоставляет мост между Java исключениями и HTTP ответами. Он связан с поддержкой пользовательского интерфейса. Этот фильтр ничего не делает, что связано с безопасностью.

Если был обнаружен AuthenticationException, фильтр будет запускать authenticationEntryPoint. Это позволяет обрабатывать ошибки аутентификации, созданные от любого подкласса AbstractSecurityInterceptor.

Если был обнаружен AccessDeniedException, фильтр будет определять является ли пользователь анонимным или нет. Если пользователь анонимный, будет запущен authenticationEntryPoint. Если не анонимный пользователь, фильтр будет делегировать AccessDeniedHandler. По умолчанию фильтр использует AccessDeniedHandlerImpl.

Для использования этого фильтра, нужно указать следующие свойства:

  • authenticationEntryPoint указывает обработчик, который должен начать аутентификационный процесс, если AuthenticationException обнаружен. Отметим, что это может также переключать протокол от http к https для SSL входа
  • requestCache определяет стратегию, используемую для записи запроса в ходе аутентификацонного процесса in order that it may be retrieved and reused once the user has authenticated. The default implementation is HttpSessionRequestCache.

F

FetchType.EAGER

@OneToMany(fetch=FetchType.EAGER), когда используется тип EAGER означает, что данные грузятся немедленно. Например, если вы имеете статью и комментарии к ней, то если вы загрузите статью, связанные комментарии загрузатся то же, но будьте осторожны - это может занять много ресурсов.

FilterChainProxy

Направляет запросы Filter к списку Spring-managed filter beans. Начиная с версии 2.0 не нужно явно настраивать FilterChainProxy бин в вашем контексте приложения, если вам конечно не требуется детальная натсройка цепочки фильтров.

FilterChainProxy загружается через стандартный Spring DelegatingFilterProxy объявление в web.xml. FilterChainProxy будет проходить GenericFilterBean.init(FilterConfig), GenericFilterBean.destroy() и doFilter(ServletRequest, ServletResponse, FilterChain) вызовы до каждого Filter опредленного относительно FilterChainProxy.

Начиная с версии 2.0, FilterChainProxy настраивается с помощью упорядоченной Map пути шаблонов в Lists of Filter objects. Map экземпляр не нужно указывать явно. Вместо этого <filter-chain-map> элемент должен использоваться вместе с FilterChainProxy бином. Он, в свою очередь, должен иметь список дочерних <filter-chain> элементов, которые определяют UTI шаблон и список фильтров, которые будут применяться к запросу, совпадающим с шаблоном.

formBackingObject

Возвращает объект, привязанный к форме. Т.е. это поля формы, которые нужно собрать и потом что-то с ними сделать в команде. Пример: формочка с полями Имя, Фамили, Отчество, Возраст и кнопка Submit на ней. Так вот, backing object это логическое представление этих полей на стороне Java. В Struts это обычный POJO.

formView

Это view, на который будет осуществлен переход в случае ошибки на форме, чтобы пользователь мог исправить свой ввод. Обычно здесь указывают URL формы.

H

Hibernate mapping

Связывание делается через xml файлы. Вот описание его основных тегов:

  • Тег class имеет два параметра: параметр name - Имя класса (необходимо указывать полный путь с учетом структуры пакетов) и параметр table - имя таблицы в базе данных, на которую будет маппиться наш класс.
  • Тег id описывает идентификатор. Параметр column указывает на какую колонку в таблице будет ссылаться поле id нашего объекта, так же указываем класс и указываем generator, который отвечает за генерацию id.
  • Тег property описывает простое поле нашего объекта, в качестве параметров указываем имя поля, его класс и имя колонки в таблице.
  • Тег set описывает поле в котором содержится некий набор(коллекция) объектов. Тег содержит параметр name - имя поля нашего объекта, параметр table - имя таблицы связи(в случае отношения многие ко многим) и параметр lazy. Lazy, если меня не подводит моя память, с английского - ленивый. Так называемые ленивые коллекци, сейчас постараюсь объяснить понятнее. Когда мы в параметре lazy указываем значечение false, то у нас при получении объекта Route из базы вместе с объектом достается и коллекция объектов Bus, так как busses это поле объекта Route. А если в качестве параметра мы указываем значение true, то коллекция объектов Bus не вытаскивается, для ее получения надо явно вызывать метод route.getBusses(). Вот предположим такой очень хороший пример. Есть объект город, в него входит массив районов, в каждый район - массив улиц, в каждую улицу - массив домов и так далее до людей, живущих в квартирах. Предположим мы хотим вытянуть из базы названия районов. Если укажем lazy = false,то помимо районом у нас вытянется еще огромный объем "ненужных" данных, если же lazy = true, то мы получим то что надо и ничего лигнего.
  • Тег key имеет параметр column, который говорит, на какую колонку в таблице связи будет ссылаться поле нашего объекта.
  • Тег many-to-many описывает связь типа многие ко многим, в качестве параметров тег использует column - имя колонки второй колонки в таблице связи и параметр class, указывающий какого класса будут объеты на той стороне.

HsqldbInitializingDriverManagerDataSource

                        
<bean id="dataSource"
          class="org.springbyexample.jdbc.datasource.HsqldbInitializingDriverManagerDataSource">
        <property name="sqlScriptProcessor">
            <bean class="org.springbyexample.jdbc.core.SqlScriptProcessor"
                  p:charset="UTF-8">
                <property name="sqlScripts">
                    <list>
                        <value>classpath:/schema.sql</value>
                        <value>classpath:/security_schema.sql</value>
                    </list>
                </property>
            </bean>
        </property>
    </bean>
		

Есть модули которые помогают создавать иницилизировать базу данных. Они расширяют SimpleDriverDataSource от Spring. SimpleDriverDataSource был добавлен в Spring в 2.5.5 версии, и так с версии 2.5.5 нужно использовать InitializingDriverManagerDataSource и HsqldbInitializingDriverManagerDataSource.

InitializingBasicDataSource - это расширение Commons DBCP BasicDataSource. Основное его отличие заключается в том, что иницилизирующий callback использует SQL скрипт на старте.

InitializingDriverManagerDataSource это расширение SimpleDriverDataSource. Он может использоваться с версии 2.5.5 и также как и в предыдущем расширении на старте использует скрипты SQL. Отметим, что это расширение создает новое соединение каждый раз когда это необходимо. Это полезно использовать для тестирования. Используйте InitializingBasicDataSource для "pooling".

HsqldbInitializingDriverManagerDataSource - это расширение InitializingDriverManagerDataSource специально для использования с HSQLDB. Здесь также при старте используются SQL скрипты. По умолчанию база создается в памяти с названием Test, именем пользователя sa и пустым паролем.

isAssignableFrom

Это аналог оператора instanceof.

M

@ModelAttribute

Ставится над методом. Указывает что метод вызовется перед любым запросом.

L

LocalContainerEntityManagerFactoryBean

Настраивается с DataSource для использования Hibernate в качестве JPA адаптера

Дает полный котроль над конфигурацией EntityManagerFactory. LocalContainerEntityManagerFactoryBean создает PersistenceUnitInfo основанный на persistence.xml файле. Таким образом, возможно работать с различными DataSources.

LocalContainerEntityManagerFactoryBean имеет свойство dataSource и jpaVendorAdapter. setJpaVendorAdapter определяет реализацию для JPA. Пояснение: JPA - это спецификация, для нее нужна реализация. Из кода видно, что реализацией является HibernateJpaVendorAdapter. По документации HibernateJpaVendorAdapter extends AbstractJpaVendorAdapter. Суть в том, что в этом коде Hibernate выступает как реализация JPA провайдера.
В него мы подаем HibernateJpaVendorAdapter - предоставляем провайдера и EntityManager

LoginUrlAuthenticationEntryPoint

Используется ExceptionTranslationFilter для начала аутентификации основанной на формах через UsernamePasswordAuthenticationFilter. Этот объект хранит размещение формы входа, относительно web app context path, и используется для перенаправления на эту форму.

R

rejectIfEmptyOrWhitespace

Проверяется условие, такое чтобы значение поля было заполненными. В случае если это не так, то в объект Errors помещается код ошибки. Например: ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "required.password", "Field name is required.");

@RequestMapping

Ставится над методами. Есть атрибут value для связывания метода и пути, атрибут method указывает HTTP запрос: GET, POST, DELETE.

@RequestParam

Получает некое поле из обрабатываемой формы. Поле нужно указывать вручную. Если не указывать конкретного имени в параметрах, то имя будет соответствовать имени класса.

@RunWith

Активирует поддержку Spring на этапе исполнения

SqlScriptProcessor

Используется для обработки SQL скриптов. Свойство initOnStartup по умолчанию равно false, но может быть установлено как true, если нужно чтобы скрипт запускался при старте.

                        
<bean id="entityManagerFactory" 
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    	  p:dataSource-ref="dataSource">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
</bean>
		

S

SecurityContextPersistenceFilter

Заполняет SecurityContextHolder информацией полученной от настроенного SecurityContextRepository перед запросом и сохраняет его обратно в репозиторий так как запрос завершен и очищает context holder. По умолчанию используется HttpSessionSecurityContextRepository.

Этот фильтр будет выполняться один раз на запрос. Он ДОЛЖЕН БЫТЬ запущен ПЕРЕД любым аутентификационным механизмом обработки. Аутентификационный механизм обработки ожидает SecurityContextHolder, содержащий действительный SecurityContext.

Информация с другого источника: В Spring Security, ответственность за хранение SecurityContext между запросами ложится на SecurityContextPersistenceFilter, который по умолчанию хранит контекст как атрибут HttpSession между запросами HTTP. Он восстанавливает контекст в SecurityContextHolder для каждого запроса и, что самое главное, очищает SecurityContextHolder после завершения запроса. Вы не должны напрямую взаимодействовать с HttpSession для решения задач безопасности. Для этого нет никаких оснований, всегда вместо этого используйте SecurityContextHolder.

Многие другие типы приложений(например, RESTful веб-сервисы без сохранения состояния) не используют HTTP сессии и будут требовать аутентификации при каждом запросе. Тем не менее, все равно очень важно, чтобы SecurityContextPersistenceFilter входил в цепочку, чтобы SecurityContextHolder очищался после каждого запроса.

successView

URL на view, куда будет осуществлен переход в случае, если ошибок не возникло.

T

Транзакции

Есть два типа транзакций — локальные и распределенные. Локальная транзакция работает с одним источником, например одна БД; распределенная использует несколько — например jms source и БД. Если мы работаем с MySQL базой, то нужно выбирать тип InnoDB, иначе транзакции не будут работать.

Для создания декларативных транзакций нужно выполнить следующие шаги:
- Определяем бин Hibernate Session Factory
- Определяем бин Transaction Manager (org.springframework.orm.hibernate3.HibernateTransactionManager)
- Определяем tx:advice, в котором описываем правила создания транзакций для тех или иных сигнатур методов
- С помощью AOP tx:advice при выполнении методов из каких классов он должен срабатывать. Тем самым эти методы станут "обернуты" в транзакции (согласно правилам, заданным при описании tx:advice).

TokenBasedRememberMeServices

Определяет предыдущего remembered пользователя через Base64 закодированные куки.
Эта реализация не использует внешнюю базу данных и является привлекательной для простых приложений. Куки будут действительны определенный период от даты последнего AbstractRememberMeServices.loginSuccess(HttpServletRequest, HttpServletResponse, Authentication). Согласно контракту интерфейса, этот метод вызывается только когда принципал удачно выполнил интерактивную аутентификацию. По существу, период времени начинается с последней попытки аутентификации, когда подготавливаются полнопочия - не с периода времени последнего входа в систему через remember-me. Реализация будет отсылать remember-me token, если только определен параметр AbstractRememberMeServices.setParameter(String).
Для реализации требуется UserDetailsService, он сможет построить действительную Authentication из возвращенного UserDetails.
Эта реализация remember-me подходит для большинства приложений. Тем не менее, мы рекомендуем реализацию основанную на базе данных, если, конечно, требуется более защищенный remember me подход.

TransactionProxyFactoryBean

Служит для перехвата вызовов методов и декларативного применения контекста транзакций для выполнения любых интенсивных транзакционных операций.
PROPAGATION_REQUIRED - используется, если требуется, чтобы методы всегда выполнялись в транзакции (этот атрибут аналогичен атрибуту TX_REQUIRED в отношении EJB-контейнера). PROPAGATION_REQUIRED означает поддержку текущей транзакции или создание новой в случае, если транзакций не имеется.
PROPAGATION_REQUIRES_NEW - используют, если требуется, чтобы новая транзакция всегда начиналась при вызове служб компонентов.

Давайте посмотрим, как этот компонент реализует основные функции, нобходимые для транзакций. У него имеется возможность инъекции в этот компонент и работы с ним любого менеджера транзакций. Определите в свойстве target целевой объект, к которому следует применять транзакции.

Наконец, (и что наиболее важно) определите transactionAttributes.

                        
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
		

Атрибуты транзакаций содержат определение того, какую следует использовать семантику транзакций. Именно здесь говорится "применить транзакции ко всем методам, начинающимся с add". Заключительное условие в этой строке служит для отката транзакции менеджером транзации при исключениях. Знак "минус" означает откат. Если требуется зафиксировать исключения, используйте знак "плюс" (+).

V

ViewRendererServlet

ViewRendererServlet - это сервлет-мост для поддержки портлета. Во время фазы визуализации DispatcherPortlet заключает PortletRequest в ServletRequest и передает управление в ViewRendererServlet для реальной визуализации. Этот процесс позволяет среде Spring Portlet MVC Framework использовать инфраструктуру View, аналогичную инфраструктуре его servlet-версии, то есть Spring Web MVC Framework.