JavaフレームワークとしてSpringを選択する理由

1。概要

この記事では、最も人気のあるJavaフレームワークの1つとしてのSpringの主な価値提案について説明します。

さらに重要なのは、Springが私たちの選択のフレームワークである理由を理解しようとすることです。Springとその構成部品の詳細は、以前のチュートリアルで広く取り上げられています。したがって、導入の「方法」の部分はスキップし、主に「理由」に焦点を当てます。

2.なぜフレームワークを使用するのですか?

特にSpringについて議論を始める前に、そもそもなぜフレームワークを使用する必要があるのか​​を理解しましょう。

Javaのような汎用プログラミング言語は、多種多様なアプリケーションをサポートすることが可能です。言うまでもなく、Javaは日々積極的に取り組み、改善されています。

さらに、この点でJavaをサポートするためのオープンソースおよびプロプライエタリライブラリが無数にあります。

では、なぜフレームワークが必要なのですか?正直なところ、タスクを実行するためにフレームワークを使用する必要は絶対にありません。ただし、いくつかの理由から、1つを使用することをお勧めします。

  • 関連する定型文ではなく、コアタスクに集中するのに役立ちます
  • 長年の知恵をデザインパターンの形でまとめます
  • 業界および規制基準を順守するのに役立ちます
  • アプリケーションの総所有コストを削減します

ここで表面をかじったところですが、その利点を無視するのは難しいと言わざるを得ません。しかし、それがすべてポジティブであるとは限らないので、キャッチは何ですか:

  • 特定の方法でアプリケーション作成するように強制します
  • 言語とライブラリの特定のバージョンにバインドします
  • アプリケーションのリソースフットプリントに追加します

率直に言って、ソフトウェア開発には特効薬はなく、フレームワークも例外ではありません。したがって、どのフレームワークを選択するか、フレームワークを選択しないかは、コンテキストから決定する必要があります。

うまくいけば、この記事の終わりまでに、JavaのSpringに関してこの決定を下すことができるようになるでしょう。

3.春の生態系の概要

Spring Frameworkの定性的評価を開始する前に、Springエコシステムがどのように見えるかを詳しく見てみましょう。

春は、Java Enterprise Editionが急速に進化し、エンタープライズアプリケーションの開発がエキサイティングでしたが、それでも面倒だった2003年のどこかで誕生しました。

Springは、Javaの制御の反転(IoC)コンテナーとして始まりました。私たちは今でもSpringを主にそれに関連付けており、実際、Springはフレームワークやその上で開発された他のプロジェクトの中核を形成しています。

3.1。SpringFramework

Spring Frameworkはモジュールに分割されているため、あらゆるアプリケーションで使用するパーツを簡単に選択できます。

  • コア:DI(依存性注入)、国際化、検証、AOP(アスペクト指向プログラミング)などのコア機能を提供します
  • データアクセス:JTA(Java Transaction API)、JPA(Java Persistence API)、およびJDBC(Java Database Connectivity)を介したデータアクセスをサポートします
  • Web:サーブレットAPI(Spring MVC)と最近のReactive API(Spring WebFlux)の両方をサポートし、さらにWebSocket、STOMP、およびWebClientをサポートします。
  • 統合:JMS(Java Message Service)、JMX(Java Management Extension)、およびRMI(Remote Method Invocation)を介したEnterpriseJavaへの統合をサポートします。
  • テスト:モックオブジェクト、テストフィクスチャ、コンテキスト管理、およびキャッシングによるユニットテストと統合テストの幅広いサポート

3.2。春のプロジェクト

しかし、Springをはるかに価値のあるものにしているのは、Springを中心に何年にもわたって成長し、活発に進化し続けている強力なエコシステムです。これらは、Springフレームワークの上に開発されたSpringプロジェクトとして構成されています。

Springプロジェクトのリストは長く、変化し続けていますが、言及する価値のあるものがいくつかあります。

  • Boot:Springをベースにしたさまざまなプロジェクトを短時間で作成するための、非常に意見が高いが拡張可能なテンプレートのセットを提供します。これにより、Tomcatまたは同様のコンテナーが組み込まれたスタンドアロンのSpringアプリケーションを非常に簡単に作成できます。
  • クラウド:サービス検出、サーキットブレーカー、APIゲートウェイなどの一般的な分散システムパターンのいくつかを簡単に開発するためのサポートを提供します。これにより、このような定型パターンをローカル、リモート、または管理対象プラットフォームに展開する労力を削減できます。
  • セキュリティ:高度にカスタマイズ可能な方法でSpringに基づくプロジェクトの認証と承認を開発するための堅牢なメカニズムを提供します。最小限の宣言型サポートにより、セッション固定、クリックジャッキング、クロスサイトリクエストフォージェリなどの一般的な攻撃から保護されます。
  • モバイル:デバイスを検出し、それに応じてアプリケーションの動作を適応させる機能を提供します。さらに、最適なユーザーエクスペリエンス、サイト設定管理、およびサイトスイッチャーのためのデバイス対応ビュー管理をサポートします。
  • バッチ:データアーカイブなどのエンタープライズシステム用のバッチアプリケーションを開発するための軽量フレームワークを提供します。スケジューリング、再起動、スキップ、メトリックの収集、およびログ記録を直感的にサポートします。さらに、最適化とパーティショニングによる大量のジョブのスケールアップをサポートします。

言うまでもなく、これはSpringが提供するものの非常に抽象的な紹介です。しかし、それは私たちの議論をさらに進めるために、Springの組織と幅に関して十分な根拠を私たちに提供します。

4.春の動き

新しいテクノロジーを理解するために、hello-worldプログラムを追加するのが通例です。

Springが、hello-world以上のことを行うプログラムを作成するための簡単な方法を作成する方法を見てみましょう。インメモリデータベースに支えられたEmployeeなどのドメインエンティティのRESTAPIとしてCRUD操作を公開するアプリケーションを作成します。さらに、基本認証を使用してミューテーションエンドポイントを保護します。最後に、古き良き単体テストがなければ、アプリケーションを完全に完成させることはできません。

4.1。プロジェクトの設定

Spring Initializrを使用してSpringBootプロジェクトをセットアップします。これは、適切な依存関係を持つプロジェクトをブートストラップするための便利なオンラインツールです。Maven構成を正しくセットアップするために、プロジェクトの依存関係としてWeb、JPA、H2、およびSecurityを追加します。

ブートストラップの詳細については、以前の記事の1つを参照してください。

4.2。ドメインモデルと永続性

With so little to be done, we are already ready to define our domain model and persistence.

Let's first define the Employee as a simple JPA entity:

@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @NotNull private String firstName; @NotNull private String lastName; // Standard constructor, getters and setters }

Note the auto-generated id we've included in our entity definition.

Now we have to define a JPA repository for our entity. This is where Spring makes it really simple:

public interface EmployeeRepository extends CrudRepository { List findAll(); }

All we have to do is define an interface like this, and Spring JPA will provide us with an implementation fleshed out with default and custom operations. Quite neat! Find more details on working with Spring Data JPA in our other articles.

4.3. Controller

Now we have to define a web controller to route and handle our incoming requests:

@RestController public class EmployeeController { @Autowired private EmployeeRepository repository; @GetMapping("/employees") public List getEmployees() { return repository.findAll(); } // Other CRUD endpoints handlers }

Really, all we had to do was annotate the class and define routing meta information along with each handler method.

Working with Spring REST controllers is covered in great details in our previous article.

4.4. Security

So we have defined everything now, but what about securing operations like create or delete employees? We don't want unauthenticated access to those endpoints!

Spring Security really shines in this area:

@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers(HttpMethod.GET, "/employees", "/employees/**") .permitAll() .anyRequest() .authenticated() .and() .httpBasic(); } // other necessary beans and definitions }

There are more details here which require attention to understand but the most important point to note is the declarative manner in which we have only allowed GET operations unrestricted.

4.5. Testing

Now we' have done everything, but wait, how do we test this?

Let's see if Spring can make it easy to write unit tests for REST controllers:

@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc public class EmployeeControllerTests { @Autowired private MockMvc mvc; @Test @WithMockUser() public void givenNoEmployee_whenCreateEmployee_thenEmployeeCreated() throws Exception { mvc.perform(post("/employees").content( new ObjectMapper().writeValueAsString(new Employee("First", "Last")) .with(csrf())) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status() .isCreated()) .andExpect(jsonPath("$.firstName", is("First"))) .andExpect(jsonPath("$.lastName", is("Last"))); } // other tests as necessary }

As we can see, Spring provides us with the necessary infrastructure to write simple unit and integration tests which otherwise depend on the Spring context to be initialized and configured.

4.6. Running the Application

Finally, how do we run this application? This is another interesting aspect of Spring Boot. Although we can package this as a regular application and deploy traditionally on a Servlet container.

But where is fun this that! Spring Boot comes with an embedded Tomcat server:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

This is a class which comes pre-created as part of the bootstrap and has all the necessary details to start this application using the embedded server.

Moreover, this is highly customizable.

5. Alternatives to Spring

While choosing to use a framework is relatively easier, choosing between frameworks can often be daunting with the choices we have. But for that, we must have at least a rough understanding of what alternatives are there for the features that Spring has to offer.

As we discussed previously, the Spring framework together with its projects offer a wide choice for an enterprise developer to pick from. If we do a quick assessment of contemporary Java frameworks, they don't even come close to the ecosystem that Spring provides us.

However, for specific areas, they do form a compelling argument to pick as alternatives:

  • Guice: Offers a robust IoC container for Java applications
  • Play: Quite aptly fits in as a Web framework with reactive support
  • Hibernate: An established framework for data access with JPA support

Other than these there are some recent additions that offer wider support than a specific domain but still do not cover everything that Spring has to offer:

  • Micronaut: A JVM-based framework tailored towards cloud-native microservices
  • Quarkus: A new age Java stack which promises to deliver faster boot time and a smaller footprint

Obviously, it's neither necessary nor feasible to iterate over the list completely but we do get the broad idea here.

6. So, Why Choose Spring?

Finally, we've built all the required context to address our central question, why Spring? We understand the ways a framework can help us in developing complex enterprise applications.

Moreover, we do understand the options we've got for specific concerns like web, data access, integration in terms of framework, especially for Java.

Now, where does Spring shine among all these? Let's explore.

6.1. Usability

One of the key aspects of any framework's popularity is how easy it is for developers to use it. Spring through multiple configuration options and Convention over Configuration makes it really easy for developers to start and then configure exactly what they need.

Projects like Spring Boot have made bootstrapping a complex Spring project almost trivial. Not to mention, it has excellent documentation and tutorials to help anyone get on-boarded.

6.2. Modularity

Another key aspect of Spring's popularity is its highly modular nature. We've options to use the entire Spring framework or just the modules necessary. Moreover, we can optionally include one or more Spring projects depending upon the need.

What's more, we've got the option to use other frameworks like Hibernate or Struts as well!

6.3. Conformance

Although Spring does not support all of Jakarta EE specifications, it supports all of its technologies, often improving the support over the standard specification where necessary. For instance, Spring supports JPA based repositories and hence makes it trivial to switch providers.

Moreover, Spring supports industry specifications like Reactive Stream under Spring Web Reactive and HATEOAS under Spring HATEOAS.

6.4. Testability

Adoption of any framework largely also depends on the fact that how easy it is to test the application built on top of it. Spring at the core advocates and supports Test Driven Development (TDD).

Spring application is mostly composed of POJOs which naturally makes unit testing relatively much simpler. However, Spring does provide Mock Objects for scenarios like MVC where unit testing gets complicated otherwise.

6.5 Maturity

Spring has a long history of innovation, adoption, and standardization. Over the years, it's become mature enough to become a default solution for most common problems faced in the development of large scale enterprise applications.

What's even more exciting is how actively it's being developed and maintained. Support for new language features and enterprise integration solutions are being developed every day.

6.6. Community Support

Last but not least, any framework or even library survive the industry through innovation and there's no better place for innovation than the community. Spring is an open source led by Pivotal Software and backed by a large consortium of organizations and individual developers.

This has meant that it remains contextual and often futuristic, as evident by the number of projects under its umbrella.

7. Reasons Not to Use Spring

There is a wide variety of application which can benefit from a different level of Spring usage, and that is changing as fast as Spring is growing.

However, we must understand that Spring like any other framework is helpful in managing the complexity of application development. It helps us to avoid common pitfalls and keeps the application maintainable as it grows over time.

This comes at the cost of an additional resource footprint and learning curve, however small that may be. If there is really an application which is simple enough and not expected to grow complex, perhaps it may benefit more to not use any framework at all!

8. Conclusion

In this article, we discussed the benefits of using a framework in application development. We further discussed briefly Spring Framework in particular.

While on the subject, we also looked into some of the alternate frameworks available for Java.

最後に、Javaの選択フレームワークとしてSpringを選択せざるを得ない理由について説明しました。

ただし、この記事はアドバイスのメモで終了する必要があります。説得力があるように聞こえるかもしれませんが、通常、ソフトウェア開発には単一の万能ソリューションはありません

したがって、私たちが解決しようとしている特定の問題に対して最も単純な解決策を選択する際に、私たちの知恵を適用する必要があります。