EJB обычно используются для реализации сервисов любого типа.Они очень хорошо интегрируются с JPA, поэтому их часто используют для доступа к БД, но это не единственное их использование.
Для EJB обычно не подходит для моделирования данных.Т.е. они должны быть глаголами в вашем приложении, а не существительными.Таким образом, следующее: неправильно :
@Stateless
@Entity
public class CreditCard { // silly, don't do this!
@Id
Long id; + getters/setters
Data expiration date; + getters/setters
}
Лучше следующее: это сервис, который при запуске приложения извлекает данные о котировках откуда-то:
@Singleton
@Startup
public class QuoteFetcher {
private List<Quote> quotes; // + getter
@PostConstruct
public fetchQuote()
quotes = SomeUrlBuilder.someUrl().getQuotes();
}
}
Ниже приведен обязательный пример DAO:
@Stateless
public class JPAInvoiceDAO implements InvoiceDAO {
@PersistenceContext
private EntityManager entityManager;
public Invoice getById(Long invoiceId) {
return entityManager.find(invoiceId, Invoice.class);
}
// More DAO methods
}
Ниже показано, как используется декларативная безопасность и как компонент ищет что-то, что было внешне отображено в его частный контекст (ENC):
@Stateless
public class TokenFetcher
@Resource
private SessionContext sessionContext;
@RolesAllowed("SYSTEM")
public Token getToken() {
return (Token) sessionContext.lookup("token");
}
}
Вторая часть вопроса, похоже, заключается в том, как использовать эти bean-компоненты в вашем коде.Существует четыре основных метода:
- Инъекция в управляемые bean-компоненты
- Начальная загрузка через JNDI
- Автоматически вызывается при запуске
- Автоматически через таймер
Инжекция - это самый простой способ, но только управляемые bean-компоненты являются кандидатами на внедрение (в основном это означает, что среда Java EE создает bean-компонент, и вы не используете new()
для его создания).
Например, инъекция:
@ManagedBean
public class InvoiceBacking {
private Long invoiceId; // + getter/setter
private Invoice invoice; // + getter
@EJB
private InvoiceDAO invoiceDAO;
@PostConstruct
public void init() {
invoice = invoiceDAO.getById(invoiceId);
}
}
(также см. Связь в JSF 2.0 # Обработка параметров запроса GET )
Начальная загрузка через JNDI:
public class SomeQuartzJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
InvoiceDAO invoiceDAO = (InvoiceDAO) new InitialContext().lookup("java:global/myApp/myEJB/InvoiceDAO");
List<Invoice> openInvoices = invoiceDAO.getAllByOpenStatus();
// verbose exception handling and closing JNDI context omitted for brevity
}
}
Бин @Singleton, показанный ранее, был примером того, как инфраструктура Java EE сама вызывает ваш код при запуске.Для автоматического таймера вы должны использовать аннотацию @Schedule для метода бина.