Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / КСТ / Разработка веб-приложений.pdf
Скачиваний:
160
Добавлен:
23.02.2015
Размер:
2.74 Mб
Скачать

15.Связывание ресурсов

15.1.Ресурсы и служба имен JNDI

Враспределённом приложении компонентам нужно иметь доступ к другим компонентам и ресурсам (например, к базам данных). Например, сервлет может вызы-

вать удаленные методы в бинах, которые извлекают информацию из базы данных. На платформе Java EE служба имен Java Naming and Directory InterfaceTM (JNDI) предо-

ставляет компоненты для размещения других компонентов и ресурсов.

Ресурс является программным объектом, который обеспечивает связи в системе, например, с серверами баз данных и с системой обмена сообщениями. Ресурс Java DataBase Connectivity (JDBCTM) иногда называется источником данных. Каждый объект ресурса идентифицируется уникальным именем, называемым JNDI-именем.

Например, ресурс JDBC для базы данных JavaDB, которая поставляется с сер-

вером Sun GlassFishTM Enterprise Server v3, имеет имя JNDI jdbc/__default.

Администратор создает ресурсы в пространстве имен (namespace) JNDI. На сервере вы можете использовать административную консоль или команды asadmin,

чтобы создать ресурсы. Приложения затем используют аннотации, чтобы внедрять

ресурсы. Если приложение использует инъекцию ресурса, сервер вызывает JNDI API,

и самому приложению не требуется ничего другого делать. Тем не менее, приложение также может делать прямые вызовы JNDI API.

Объект ресурса и имя JNDI связываются вместе службой присваивания имен и службой директорий. Для того, чтобы создать новый ресурс, вводится новая связь имени с объектом в JNDI. Вы получаете ресурсы, используя аннотации @Resource в

приложении.

Можно использовать дескриптор развертывания, чтобы перекрыть отображение ресурса, которое определили в аннотации. Использование дескриптора развертывания позволяет изменять приложение, переупаковывая, а не перекомпилируя исходные файлы. Тем не менее, для большинства приложений дескриптор развертывания

может отсутствовать.

15.2. Объекты DataSource и пулы соединений (Connection Pools)

Для того чтобы хранить, просматривать и извлекать данные, большинство при-

ложений используют реляционную базу данных. Компоненты Java EE 6 могут иметь

доступ к реляционным базам данных через JDBC API. С информацией о JDBC API

можно ознакомиться по адресу http://java.sun.com/javase/technologies/database/.

ВJDBC API базыданныхдоступныприпомощиобъектовDataSource.DataSource

имеет набор свойств, которые идентифицируют и описывают реальный источник дан-

ных, который он представляет. Эти свойства включают информацию, как например,

расположение сервера базы данных, имя базы данных, используемый сетевой протокол для связи с сервером и так далее. В Sun GlassFish источник данных называется

ресурсом JDBC.

Приложения имеют доступ к источнику данных, используя соединение и объект

DataSource, который понимается как инструмент для связи с конкретным источником.

180

В основной реализации DataSource вызов метода getConnection возвращает объект связи, который является физической связью с источником данных.

Если объект DataSource зарегистрирован в службе имен JNDI, то приложение может использовать JNDI API, чтобы иметь к нему доступ, а объект DataSource может быть использован, чтобы подключаться к источнику данных, который он представляет. DataSource реализуетсоединениечерезпулсконкретнымисточникомданных,который представляет класс DataSource. Объект связи, возвращаемый методом getConnection, является ссылкой на объект PooledConnection, а не физической связью. Пул соединений не виден прикладному коду, за исключением того, что соединение должно всегда закрываться явно. Когда приложение закрывает соединение, оно возвращается в пул для повторного многократного использования. Поскольку механизм пула соединений не всегда создает новую физическую связь каждый раз, когда она требуется, приложения могут работать значительно быстрее.

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

Приложения, которые используют язык Persistence API, определяют объект

DataSource, который они используют в элементе jta-data-source файла persistence.xml.

<jta-data-source>jdbc/MyOrderDB</jta-data-source>

Обычно это единственная ссылка на объект JDBC для устройства хранения. Прикладной код сам не ссылается на объекты JDBC.

15.3. Внедрение ресурсов

Аннотации класса javax.annotation.Resource используются, чтобы объявить ссылку на ресурс. Аннотация @Resource может декорировать класс, поле или метод. Контейнер подключит ресурс, на который ссылается аннотация @Resource, в компонент или в период исполнения, или когда компонент инициализирован, в зависимости от использования поля/метода или экземпляра класса. Для инъекции поля или метода контейнер внедрит ресурс, когда приложение будет инициализировано. Для инъекции класса ресурс отыскивается при исполнении приложения.

Аннотация @Resource имеет следующие элементы:

name — имя JNDI-ресурса;

type — тип языка Java для ресурса;

authenticationType — тип аутентификации для ресурса;

shareable указывает на совместное использование ресурса;

mappedName — зависящее от реализации непортируемое имя, на которое ресурс должен быть отображен;

description — описание ресурса.

Элемент name является JNDI-именем ресурса, факультативным для внедрения («инъекции») на базе поля или метода. Для внедрения на базе поля по умолчанию имя является именем поля, заданным с именем класса. Для инъекции на базе метода по умолчанию имя является именем свойства JavaBeans, квалифицированным именем

класса. Элемент имени должен быть определён в инъекции на базе класса.

181

Тип ресурса определен одним из следующих способов:

типом поля в аннотации ресурса @Resource декорируют инъекции на базе поля;

типом свойства JavaBeans в аннотации @Resource декорируют инъекции на базе метода;

элементом type аннотации @Resource. Элемент type требуется для инъек-

ции на базе класса.

Элемент authenticationType (например, ресурсы коннекторов, также называе-

мые адаптерами ресурсов или источниками данных) используется только фабрикой соединений. Этот элемент может быть установлен в одно из значений перечисле-

ния javax.annotation.Resource.AuthenticationType: CONTAINER (по умолчанию) или

APPLICATION.

Элемент shareable используется только экземплярами ресурса Object Resource

Broker (ORB) или фабрикой соединений ресурсов. Он указывает возможность разделения ресурса между этим и другими компонентами и может быть установлен в true

(по умолчанию) или в false.

Элемент mappedName — непортируемое, зависящее от реализации имя, на

которое ресурс должен быть отображен. Поскольку элемент name, когда он определен явно или по умолчанию, локализован в приложении, многие серверы Java EE обеспечивают путь к этому ресурсу посредством установки элемента mappedName.

Элемент description является описанием ресурса, обычно по умолчанию на язы-

ке системы, на которой приложение развернуто для того, чтобы помогать разработчи-

кам идентифицировать и выбирать правильный ресурс.

15.3.1. Внедрение ресурсов на базе поля

Для того чтобы использовать инъекции на базе поля, объявите поле и укажите

аннотацию @Resource. Контейнер сам задаст имя и тип ресурса, если элементы name и type не определены. Если вы определяете элемент type, это должно соответствовать декларации типа поля.

package com.example; public class SomeClass {

@Resource

private javax.sql.DataSource myDB;

...

}

В данном коде контейнер задаёт имя ресурса, основанное на имени класса и имени поля: com.example.SomeClass/myDB. Вычисленный тип ресурса будет javax.sql.

DataSource.class.

package com.example; public class SomeClass {

@Resource(name="customerDB") private javax.sql.DataSource myDB;

...

}

В этом коде имя JNDI — customerDB, а найденный тип — javax.sql.DataSource.

class.

182

15.3.2. Инъекция на основе метода (Method-based)

Для того чтобы использовать инъекцию на основе метода, объявите включение

метода с аннотацией @Resource. Контейнер задаст имя и тип ресурса, если элементы

имени и типа не определены. Метод setter должен следовать соглашениям JavaBeans

об именах свойств: имя метода должно начаться с set, иметь тип void и только один

параметр. Если вы определяете элемент типа, он должен соответствовать декларации типа поля.

package com.example; public class SomeClass {

private javax.sql.DataSource myDB;

...

@Resource

private void setMyDB(javax.sql.DataSource ds) { myDB = ds;

}

...

}

В приведённом фрагменте кода, контейнер строит имя ресурса, основанное на

имени класса и имени поля: com.example.SomeClass/myDB. Созданный тип является javax.sql.DataSource.class.

package com.example; public class SomeClass {

private javax.sql.DataSource myDB;

...

@Resource(name="customerDB")

private void setMyDB(javax.sql.DataSource ds) { myDB = ds;

}

...

}

В этом коде имя JNDI customerDB, а тип — javax.sql.DataSource.class.

15.3.3. Инъекция на основе класса (Class-based)

Для того чтобы сделать инъекцию для класса, используется аннотация @Resource и при необходимости элементы name и type.

@Resource(name="myMessageQueue",

type="javax.jms.ConnectionFactory") public class SomeMessageBean {

...

}

Объявление нескольких ресурсов

Аннотацию @Resource можно использовать, чтобы сгруппировать вместе не-

сколько деклараций ресурсов для инъекции на базе класса.

Resources({

@Resource(name="myMessageQueue",

type="javax.jms.ConnectionFactory"),

@Resource(name="myMailSession",

183

Соседние файлы в папке КСТ