Java EE - кто реализует спецификацию?

У меня есть опыт работы с основными Java и Java EE. Я прочитал различный вопрос о SO, чтобы понять, что такое Java EE? И немного ответов в SO: what-exactly-is-java-ee, what-is-java-ee

У меня есть некоторые сомнения:

1) Если Java EE - это просто спецификация, кто их реализует? Используют ли серверы приложений (например, JBOSS, GlassFish) эти спецификации?

2) Если я прав, спецификация EJB реализуется контейнером EJB, и я считаю, что EJB Container является частью Application Server. Теперь, когда мы, разработчики, пишем код EJB, что мы на самом деле делаем? У меня есть сомнение, контейнер EJB реализует спецификацию EJB, поэтому мы переопределяем некоторую "часть спецификации" EJB? Почему какая-то часть EJB реализуется контейнером EJB и что-то, что разработчики пишут? ИЛИ что какая-то часть EJB должна быть предоставлена ​​контейнером EJB и какая-то часть, которая должна быть разработана разработчиками? Мне трудно понять это.

Пожалуйста, помогите кому-нибудь понять это?

Ответ 1

Любой может реализовать спецификацию java ee (JSR342) или любой jsr, что его часть. Когда они это сделают, они могут (после покупки и передачи Compatibility Test Suite) утверждать, что они совместимы со спецификацией. Существует ряд поставщиков с серверами приложений, которые совместимы с java ee, но ни один поставщик не реализует полную спецификацию java ee. Например, Glassfish (эталонная реализация java ee) использует Red Hat CDI. Иногда поставщик не реализует какую-либо часть спецификации java ee, они захватывают стеклянную рыбку, добавляют свои специфические для конкретного поставщика библиотеки и выпускают ее под своим именем. Чтобы требовать совместимости, им все равно нужно пройти процесс сертификации и запустить CTS.

Чтобы узнать, все ли поставщики, которые внедряют спецификацию, не так просто, поскольку не все они проходят процесс сертификации. Например, Apache CXF не сертифицирован сам по себе, скорее он получает сертификат как часть Red Hat JBoss.

Каждая спецификация имеет API и письменный pdf файл, оба из которых определяют обязательное поведение каждой реализации. Это то, что вы используете, когда пишете EJB-код. Например, когда вы создаете ejb:

import javax.ejb.Singleton;
@Singleton
public class MySingleton{
   ... 
}

аннотация @Singleton является частью спецификации, но класс MySingleton - ваш EJB-код, он не является частью спецификации. Затем контейнер EJB знает, что делать с классом.

Ответ 2

Да, поставщики EJB-контейнера (сервера приложений), такие как RedHat, реализуют спецификацию J2EE в своих продуктах (например, JBoss).

То, что они не делают, - это реализовать любую бизнес-логику (просто "сантехника", если хотите). Именно здесь приходят разработчики приложений.

Так же, как Apache HTTPD или nginx реализуют спецификацию протокола HTTP, но это не делает веб-сайт.

Ответ 3

Любой может реализовать спецификацию J2EE, хотя я бы не рекомендовал вам попробовать сделать это самостоятельно. Вы правы, это обычно осуществляется серверами приложений, чтобы вы могли запускать приложение в контейнере, совместимом с J2EE. Существуют также библиотеки с открытым исходным кодом, которые при объединении и добавлении в Tomcat будут выполнять спецификацию (см., Например, tomee).

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

Ответ 4

В случаях спецификаций Java (Java EE, JSF, другие JSR) у вас обычно есть эталонная реализация, созданная при разработке спецификации (Glassfish в случае Java EE), тогда у вас есть другие провайдеры, которые могут создавать свою собственную реализацию spec (часто утверждая, что он "лучше" каким-то образом).

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

Ответ 5

1) Серверы приложений реализуют спецификацию, и, выпуская свои серверы, они будут предоставлять подробную информацию об их реализации. Для справки ознакомьтесь с этой ссылкой , которая указывает различные JSR, реализованные JBOSS 7.

2) Когда мы просто используем любую реализацию, предоставляемую сервером приложений, экземпляр будет взят из реализации, предоставляемой сервером. Если мы переопределили класс, то наш переопределенный класс будет предоставлен в наших операциях.