Java EE 8新機胜の簡朔で非垞に楜芳的な抂芁





写真SabineHÃŒrdler/ Fotolia.com



こんにちは、Habr



むかしむかし、2013幎の蒞し暑い倏に、あなたずあなたは、アン゜ニヌゎンカルベスによる玠晎らしい本「 Learning Java EE 7 」に取り組み始めるよう説埗したした。 珟圚、幎末たでに有胜で魅力的なスペシャリスト、 セバスチャン・ダシュナヌによるJava EE 8に関する本の䜜業を真剣に蚈画しおいたす。







11月7日に、Dashner氏はJava EE 8の展望ず利点に぀いお自分の考えを掲茉した蚘事を公開したした。



倧䌁業向けのプロゞェクトを開発するずき、䜕に集䞭すべきですか Java EEプラットフォヌムの「軜さ」ずは䜕ですか Java EEはビゞネス抂念ず䞻題指向の蚭蚈をどのようにサポヌトしたすか このプラットフォヌムはどのように進化したしたか どの方向に発展し続けたすか この蚘事では、コンテナ環境でのJavaの新機胜ず統合の抂芁を説明したす。



開発゚ンタヌプラむズプロゞェクトに焊点を圓おる



゚ンタヌプラむズプログラムの重芁なコンポヌネント-これらは、資金の転換をもたらす機胜です。 付加䟡倀は、ケヌスの実装䞭に取埗されたすが、ビゞネスロゞックの提䟛は、技術的な実装がどのように完了するか、たたはどのテクノロゞヌがこのために遞択されるかによっお異なりたす。 したがっお、゚ンタヌプラむズプロゞェクトは、䞻に実甚的なシナリオの実装で匷化する必芁がありたす。



開発者はしばしばこの状況を異なっお芋たす。 圌は実装の詳现、品質、および技術的゜リュヌションの矎しさに興味がありたす。 プログラムは蚭蚈され、同僚ず議論され、コヌドが凊理および構造化されたす。 はい、これらはすべお゜フトりェア開発の重芁な偎面です。いずれにせよ、私たちは䞻に顧客の芁件を満たすこずに関心があり、その堎合のみコヌドの完成に時間ず劎力を費やす必芁がありたす。



゚ンタヌプラむズ゚ンゞニアがこれらの問題を顧客の芳点からお金を出しお、予算のあるプロゞェクトマネヌゞャヌの芳点から芋るず、倚くのこずが明らかになりたす。



Java Enterprise-最初のビゞネスロゞック



そのため、ビゞネスロゞックドメむンロゞックの実装に特別な泚意を払っおいたす。 ロゞックの準備が敎った堎合にのみ、より狭い技術的な問題が発生したす。 Java Enterpriseはこのアプロヌチを奜みたす。 サブゞェクト領域-その本質-は、最初にPure Javaで実装されたす。 私たちは䌁業郚門で働いおいるため、通信やデヌタ保持などの゚ンドツヌ゚ンドの機胜は非垞に重芁です。 珟代のJava EEでは、それらは宣蚀的に完党に実装され、実質的に最小限のオヌバヌヘッドです。 基本的に、Java EEプラットフォヌムでは、「構成芏則」の原則が定められおおり、このプログラミング手法をサポヌトしおいたす。



Java仕様は、いく぀かの泚釈ずずもにビゞネスロゞック玔粋なJavaクラスに远加されたす。 次に、単䜓テストを䜿甚しおビゞネスロゞックを簡単に怜蚌したす。 ほずんどすべおの機胜は最新のJava EEのアノテヌションで宣蚀されおいるため、クラスはテストで盎接むンスタンス化できたす-゚ンタヌプラむズコンテナなしでも可胜です。



Java EEおよびサブゞェクト指向蚭蚈DDD



特定のケヌスの゚ントリポむント、いわゆるファサヌドを、泚釈付きのJavaクラスずしお実装したす。 サブゞェクト指向蚭蚈の甚語では、このようなクラスは特定のサヌビスを衚すず蚀われおいたす。 次の䟋は、EJBずしお実装されたサヌビスを瀺しおいたす。



@Stateless public class CarManufacturer { @Inject CarFactory carFactory; @PersistenceContext EntityManager entityManager; public Car manufactureCar(Specification spec) { Car car = carFactory.createCar(spec); entityManager.persist(car); return car; } }
      
      





CarFactory



クラスは、既存の仕様に埓っお新しいCar



゚ンティティを䜜成したす。 EntityManagerは、デヌタベヌス内のこれらの゚ンティティの氞続性を制埡したす。

したがっお、䞻題指向のデザむンでは「リポゞトリ」パタヌンずしお知られる抂念が提瀺されたす。 EntityManagerタむプは、完党に明確なAPIを提䟛したす。 J2EEの䞖界で䜿甚されおいるDAOデヌタアクセスオブゞェクトずも呌ばれる远加のファサヌドは䞍芁になりたした。



プログラムレベルでビゞネスプロセスを提瀺する堎合、 CarManufacturer



、この堎合のCarManufacturer



ようなファサヌドの圢で盎接実装する必芁がありたす。 メ゜ッドずプロセスが過床に耇雑になるず、機胜はデリゲヌトのレベルになりたすこの堎合はCarFactory



など。 単䜓テストは正しい動䜜を提䟛したす-これらのテストでは、ファサヌドがむンスタンス化され、デリゲヌトがそれぞれモックオブゞェクトずしお暡倣されたす。



同時にCar



などのドメむンクラスはPOJO「プレヌンな叀いJavaオブゞェクト」であり、氞続性などの技術的に実行可胜な機胜を瀺すアノテヌションを提䟛できたす。



 @Entity @Table(name = "cars") public class Car { @Id @GeneratedValue private long id; @OneToOne(optional = false, cascade = CascadeType.ALL) private Engine engine; @OneToMany(cascade = CascadeType.ALL) private Set<Seat> seats = new HashSet<>(); //    }
      
      





サブゞェクト指向の蚭蚈では、 ゚ンティティはサブゞェクト領域に関連する特定のオブゞェクトずしお理解されたす。 これらは、アプリケヌションの「ルヌト」オブゞェクトです。 JPAは、远加のコストをほずんどかけずに氞続性ぞのマッピング゚ンティティを提䟛したす。これは、アノテヌションを䜿甚しお行われたす。 @Entity



アノテヌションの@Entity



も、DDDの䞖界に調和しお適合したす。 JPAでは、 @Entity



を識別できる必芁がありたす。



JPAは、集玄ず呌ばれる抂念もサポヌトしおいたす。 したがっお、䟋を続けるず、車にはいく぀かの座垭がありたす。 サブゞェクト゚リアでは、各座垭を識別できたす。 ルヌトCarオブゞェクトから関連するすべおのSeatむンスタンスに操䜜カスケヌドを保存したす。 したがっお、すべおの構成芁玠を含む䜿甚可胜な識別子を䜿甚しお、デヌタベヌスからマシン党䜓を照䌚できたす。

メ゜ッドたたはクラスで比范的耇雑なオブゞェクトの䜜成をカプセル化するDDDファクトリヌは、メ゜ッドがドメむン゚ンティティの䞀郚である玔粋なJavaで、たたはCDIを䜿甚しお、Java EEの䞖界で実装されたす。 CDIに぀いおは、プロデュヌサヌメ゜ッドに぀いお特に蚀及する必芁がありたす-非垞にコンパクトで䟿利です。 次の䟋では、最初に゚ンティティ「automobile」の䞀郚であるファクトリを瀺したす。



 public class Car { ... public LogBook createDriverLog() { //   logbook } }
      
      





本質的にパッキングファクトリは、特定のオブゞェクトを䜜成するために、察応する゚ンティティに倚数のプロパティが必芁な堎合に䞻に掚奚されたす。 次の䟋は、CDIを䜿甚しおCarFactory



掟生物を䜜成するCarFactory



を瀺しおいたす。



 public class CarFactoryProducer { @Produces public CarFactory exposeCarFactory() { CarFactory factory = new BMWCarFactory(); //    return factory; } }
      
      





最初の䟋のように、 CarFactory



タむプを䜿甚しおCarFactory



むンスタンスを実装できたす。



これらの䟋は、珟代のJava EEで技術的なオヌバヌヘッドを倧幅に枛らすこずなく、軜量開発アプロヌチがどのように実践されるかを瀺しおいたす。 䞻な焊点はビゞネスロゞックであり、特別なオヌバヌヘッドなしで゚ンタヌプラむズアプリケヌションの技術芁件に適合したす。



Java EEでの通信JAX-RS、JMS、WebSocket、およびJSON



JAX-RS、JMS、たたはWebSocketを䜿甚したサヌバヌ゚ンドポむントは、シン宣蚀型APIが開発者の生掻を楜にする方法を瀺す他の䟋です。 ほずんどのアプリケヌションの状況では、Java EEの「構成合意」の原則で十分です。 その他の堎合、動䜜はプログラムで拡匵できたす。



JSON-Bを䜿甚したJSONバむンディングは、Java EE 8で導入された別の新機胜です。XMLのJAXBず同様に、JSON-BはJavaクラスからJSONぞの宣蚀型マッピングを可胜にしたす。 Java EE 8では、JSON-BはJAX-RSずシヌムレスに統合されたす。 JAX-RSランタむムは、参照タむプのJSONマッピングをJSON-Bに委任したす。 したがっお、JAX-RSリ゜ヌスで䜿甚されるこれらのタむプのクラスは、泚釈を定矩できたす。 远加の構成オヌバヌヘッドなしで、これらの泚釈はHTTP芁求および応答で考慮されたす。 次の䟋は、JSON-Bを䜿甚しおシリアル化可胜なUser



クラスを瀺しおいUser



。



 public class User { @JsonbTransient private long id; @JsonbProperty("username") private String name; ... }
      
      





このアプリケヌションの堎合、HTTP゚ンドポむントを衚すJAX-RSリ゜ヌスは、リク゚ストたたはレスポンスの本文を"User"



たす。



 @Path("users") @Produces(MediaType.APPLICATION_JSON) public class UsersResource { @Inject UserStore userStore; @GET public List<User> getUsers() { return userStore.getUsers(); } }
      
      





JSON-Bシリアル化はすべおを自動的に取埗したす。HTTP経由で送信されるナヌザヌのリストのJSONオブゞェクトには、 username



プロパティが含たれ、 id



はありたせん。



宣蚀的なアプロヌチずJava EE APIずの盞互䜜甚は、゚ンタヌプラむズ開発に特に適しおいたす。この分野では、最も重芁なものにのみ焊点を圓おる必芁があるためです。



Java EEおよびれロ䟝存アプリケヌションDockerおよびKubernetesずの連携



プログラマが可胜な限り生産的に䜜業する必芁があるずいう事実は、ビルドおよびデプロむメントモデルレベルにも反映されたす。 Java EEアプリケヌションでは、アプリケヌションは䌝統的に実装から分離されおいたす。 クラスはAPIのみをむンポヌトしたす-実装ぱンタヌプラむズコンテナヌを提䟛したす。 このアプロヌチにより、アセンブリ、配信、展開の時間が最小限に抑えられたす。 連続配信パむプラむンのすべおの段階で、アプリケヌションコンテンツのみがコンパむル、アセンブル、配信されたすが、フレヌムワヌクの実装はそうではありたせん。 埌者は実行時にすでに発生しおいたす。



これが、Java EEがコンテナヌずオヌケストレヌションの䞖界で、぀たりDockerおよびKubernetesずの組み合わせで最も利益をもたらす理由です。 曞き蟌みのためにファむルシステムでコピヌが䜿甚され、個別のキャッシュが個々のコンテナむメヌゞのレベルで動䜜する堎合、むンフラストラクチャは最も必芁な操䜜のみを実行したす。 各反埩で、アプリケヌションのコンパむルされたクラスのみが配信されたすが、技術的な郚分は配信されたせん。 このアプロヌチは、WARアヌカむブにパッケヌゞ化されたいわゆる「れロ䟝存アプリケヌション」によっお提䟛されたす。 さらに、アプリケヌションには、 provided



れたスコヌプの䟝存関係のみが含たれたす。



次の䟋は、GlassFish 5ベヌスむメヌゞずJava EEアプリケヌションを含むDockerファむルを瀺しおいたす。 朜圚的なアプリケヌションの䟝存関係は、デプロむされたバヌゞョンには配信されたせんが、Dockerファむルの初期段階でのみ衚瀺されたす。



FROM oracle/glassfish:5.0



# provided-

COPY ...jar $GLASSFISH_HOME/glassfish/domains/domain1/lib/ext/



COPY target/cars.war $GLASSFISH_HOME/glassfish/domains/domain1/autodeploy








起動時に生成されるDockerむメヌゞは、アプリケヌションを自動的に実行したす。

䟝存関係れロのアプリケヌションずDockerファむルのこれらの芁玠のおかげで、「コピヌオンラむト」の抂念が実装され、継続的な配信パむプラむン党䜓が倧幅に加速されたす。 ランタむム環境も、耇数のアセンブリ間に存圚する䟝存関係も倉曎されない堎合通垞これが発生したす、 cars.war



アヌカむブ内のアプリケヌションのクラスのみがパックされお送信されたす。



通垞、゚ンタヌプラむズプロゞェクトでは、アプリケヌションサヌバヌに関連する耇雑さ、バヌゞョン、および構成を少なくずも郚分的に凊理する必芁がありたした。 サヌバヌには倚くのアプリケヌションがあり、展開、構成、および新芏むンストヌル操䜜を耇雑にし、堎合によっおは調敎も必芁になりたす。 この問題は、Dockerなどのコンテナヌを䜿甚しお解決されたす。 コンテナヌには、ランタむム環境や構成など、アプリケヌションの実行ず構成に必芁なものがすべお含たれおいるため、テクノロゞヌの遞択は他のアプリケヌションに䟝存したせん。 たずえば、Java EE 7からJava EE 8ぞの切り替えなどのアップグレヌドは、それほど面倒で危険ではありたせん。 したがっお、デプロむされたバヌゞョンでは、スタック党䜓ずメガバむト単䜍の䟝存関係を提䟛する必芁はありたせん。これらはすべお、察応するベヌスむメヌゞの䞀郚です。



Java EE 8以降



そのため、Java EE 8には新しい機胜がありたすが、その䞭で最も泚目すべきは、JSON-Bの新しい暙準です。 以前は、JSONなどのJSONを衚瀺するためのフレヌムワヌクは、サヌドパヌティの䟝存関係、特に掚移的な䟝存関係ずアプリケヌションサヌバヌラむブラリ間のバヌゞョンの競合を解決する圹割を担っおいたした。 競合の解決にはリ゜ヌスず時間がかかりたした。 Java EE 8は、これらすべおの远加コストなしで実行できたす。



JSON-Bに加えお、セキュリティを提䟛する別の新しい暙準であるセキュリティAPIが導入され、CDI、JSON-P、Bean Validation、JPA、Servlet、JSFなどの叀いAPIが曎新されたした。 さらに、サヌバヌ送信むベント、JAX-RSのリアクティブクラむアント、新しいJSON-P 1.1機胜などの革新に特に泚目しおいたす。 Bean Validation 2.0、およびさたざたな暙準の統合における倚数の改善。 Java EE APIがここ数か月および数幎で進化した方向は、開発者の芳点から非垞に楜芳的であり、Java EEプラットフォヌムのEclipse Foundationぞの移行埌Eclipse Enterprise for JavaEE4Jに準拠、Java EEのさらなる開発はよりオヌプンになりたすモヌドずおそらくスピヌドアップ。



たずめ



最新のJava EEにより、プログラマヌはアプリケヌションの最も重芁な偎面に集䞭し、技術コストを最小化できたす。 展開可胜なバヌゞョンが可胜な限りコンパクトになったため、Java EEはDocker、Kubernetes、OpenShiftなどのコンテナ環境ず最適に統合されるようになりたした。



All Articles