Tại sao chọn Spring làm Java Framework của bạn?

1. Khái quát chung

Trong bài viết này, chúng ta sẽ xem xét mệnh đề giá trị chính của Spring là một trong những khung công tác Java phổ biến nhất.

Quan trọng hơn, chúng tôi sẽ cố gắng hiểu lý do để Spring trở thành khuôn khổ lựa chọn của chúng tôi. Chi tiết về Spring và các bộ phận cấu thành của nó đã được đề cập rộng rãi trong các hướng dẫn trước đây của chúng tôi. Do đó, chúng tôi sẽ bỏ qua phần giới thiệu “cách thức” và chủ yếu tập trung vào phần “tại sao”.

2. Tại sao sử dụng bất kỳ khung nào?

Trước khi bắt đầu thảo luận cụ thể về Spring, trước tiên chúng ta hãy hiểu tại sao ngay từ đầu chúng ta cần sử dụng bất kỳ framework nào.

Một ngôn ngữ lập trình mục đích chung như Java có khả năng hỗ trợ nhiều loại ứng dụng . Chưa kể rằng Java đang tích cực được nghiên cứu và cải thiện mỗi ngày.

Hơn nữa, có vô số thư viện mã nguồn mở và độc quyền để hỗ trợ Java trong vấn đề này.

Vậy rốt cuộc tại sao chúng ta cần một khuôn khổ? Thành thật mà nói, không nhất thiết phải sử dụng một khuôn khổ để hoàn thành một nhiệm vụ. Tuy nhiên, bạn nên sử dụng một cái vì một số lý do:

  • Giúp chúng tôi tập trung vào nhiệm vụ cốt lõi hơn là bản ghi sẵn liên quan đến nó
  • Kết hợp nhiều năm trí tuệ dưới dạng các mẫu thiết kế
  • Giúp chúng tôi tuân thủ các tiêu chuẩn ngành và quy định
  • Giảm tổng chi phí sở hữu ứng dụng

Ở đây chúng tôi mới chỉ sơ lược bề nổi và phải nói rằng những lợi ích khó có thể bỏ qua. Nhưng nó không thể là tất cả các mặt tích cực, vì vậy điều bắt buộc:

  • Buộc chúng tôi phải viết một ứng dụng theo một cách cụ thể
  • Liên kết với một phiên bản ngôn ngữ và thư viện cụ thể
  • Thêm vào nguồn tài nguyên của ứng dụng

Thành thật mà nói, không có viên đạn bạc nào trong việc phát triển phần mềm và các framework chắc chắn không phải là ngoại lệ. Vì vậy, việc lựa chọn khung nào hoặc không khung nào nên được thúc đẩy từ ngữ cảnh.

Hy vọng rằng chúng ta sẽ sẵn sàng hơn để đưa ra quyết định này đối với Spring trong Java vào cuối bài viết này.

3. Tổng quan ngắn gọn về hệ sinh thái mùa xuân

Trước khi bắt đầu đánh giá định tính về Spring Framework, chúng ta hãy xem xét kỹ hơn hệ sinh thái Spring trông như thế nào.

Mùa xuân xuất hiện ở đâu đó vào năm 2003 vào thời điểm Java Enterprise Edition đang phát triển nhanh chóng và việc phát triển một ứng dụng doanh nghiệp rất thú vị nhưng vẫn tẻ nhạt!

Spring bắt đầu như một vùng chứa Inversion of Control (IoC) cho Java. Chúng tôi vẫn chủ yếu liên quan đến Spring và trên thực tế, nó tạo thành cốt lõi của khung và các dự án khác đã được phát triển trên đó.

3.1. Khung mùa xuân

Spring framework được chia thành các mô-đun giúp bạn thực sự dễ dàng chọn và chọn các phần để sử dụng trong bất kỳ ứng dụng nào:

  • Core: Cung cấp các tính năng cốt lõi như DI (Dependency Injection), Internationalization, Validation và AOP (Aspect Oriented Programming)
  • Truy cập dữ liệu: Hỗ trợ truy cập dữ liệu thông qua JTA (Java Transaction API), JPA (Java Persistence API) và JDBC (Java Database Connectivity)
  • Web: Hỗ trợ cả API Servlet (Spring MVC) và API phản ứng gần đây (Spring WebFlux) và hỗ trợ thêm WebSockets, STOMP và WebClient
  • Tích hợp: Hỗ trợ tích hợp với Enterprise Java thông qua JMS (Java Message Service), JMX (Java Management Extension) và RMI (Remote Method Invocation)
  • Thử nghiệm: Hỗ trợ rộng rãi cho thử nghiệm đơn vị và tích hợp thông qua Đối tượng mô phỏng, Đồ đạc thử nghiệm, Quản lý ngữ cảnh và Bộ nhớ đệm

3.2. Dự án mùa xuân

Nhưng điều làm cho Spring có giá trị hơn nhiều là một hệ sinh thái mạnh mẽ đã phát triển xung quanh nó trong những năm qua và điều đó tiếp tục phát triển tích cực . Chúng được cấu trúc như các dự án Spring được phát triển trên nền tảng Spring.

Mặc dù danh sách các dự án mùa xuân là một danh sách dài và nó liên tục thay đổi, nhưng có một số điều đáng nói:

  • Khởi động: Cung cấp cho chúng tôi một bộ mẫu có tính kiên quyết cao nhưng có thể mở rộng để tạo các dự án khác nhau dựa trên Spring trong thời gian gần như không mất thời gian. Nó giúp bạn thực sự dễ dàng tạo các ứng dụng Spring độc lập với Tomcat được nhúng hoặc một vùng chứa tương tự.
  • Đám mây: Cung cấp hỗ trợ để dễ dàng phát triển một số mẫu hệ thống phân tán phổ biến như khám phá dịch vụ, bộ ngắt mạch và cổng API. Nó giúp chúng tôi cắt giảm nỗ lực triển khai các mẫu soạn sẵn như vậy trong các nền tảng cục bộ, từ xa hoặc thậm chí được quản lý.
  • Bảo mật: Cung cấp một cơ chế mạnh mẽ để phát triển xác thực và ủy quyền cho các dự án dựa trên Spring theo cách có thể tùy chỉnh cao. Với hỗ trợ khai báo tối thiểu, chúng tôi nhận được sự bảo vệ chống lại các cuộc tấn công phổ biến như cố định phiên, kích hoạt nhấp chuột và giả mạo yêu cầu trên nhiều trang web.
  • Di động: Cung cấp khả năng phát hiện thiết bị và điều chỉnh hành vi ứng dụng cho phù hợp. Ngoài ra, hỗ trợ quản lý chế độ xem nhận biết thiết bị để có trải nghiệm người dùng tối ưu, quản lý tùy chọn trang web và trình chuyển đổi trang web.
  • Batch: Cung cấp một khuôn khổ nhẹ để phát triển các ứng dụng hàng loạt cho các hệ thống doanh nghiệp như lưu trữ dữ liệu. Có hỗ trợ trực quan để lập lịch, khởi động lại, bỏ qua, thu thập số liệu và ghi nhật ký. Ngoài ra, hỗ trợ mở rộng quy mô cho các công việc khối lượng lớn thông qua tối ưu hóa và phân vùng.

Không cần phải nói rằng đây là một phần giới thiệu khá trừu tượng về những gì Spring cung cấp. Nhưng nó cung cấp cho chúng tôi đủ cơ sở về tổ chức và bề rộng của Spring để thảo luận thêm.

4. Spring in Action

Thông thường, thêm chương trình hello-world để hiểu bất kỳ công nghệ mới nào.

Hãy xem cách Spring có thể biến nó thành một con đường để viết một chương trình không chỉ là hello-world . Chúng tôi sẽ tạo một ứng dụng sẽ hiển thị các hoạt động CRUD dưới dạng API REST cho một thực thể miền như Nhân viên được hỗ trợ bởi cơ sở dữ liệu trong bộ nhớ. Hơn nữa, chúng tôi sẽ bảo vệ các điểm cuối đột biến của mình bằng cách sử dụng xác thực cơ bản. Cuối cùng, không có ứng dụng nào có thể thực sự hoàn chỉnh nếu không có các bài kiểm tra đơn vị cũ, tốt.

4.1. Thiết lập dự án

Chúng tôi sẽ thiết lập dự án Spring Boot của mình bằng cách sử dụng Spring Initializr, đây là một công cụ trực tuyến tiện lợi để khởi động các dự án với các phụ thuộc phù hợp. Chúng tôi sẽ thêm Web, JPA, H2 và Bảo mật làm phụ thuộc của dự án để thiết lập cấu hình Maven một cách chính xác.

Thông tin chi tiết về bootstrapping có sẵn trong một trong các bài viết trước của chúng tôi.

4.2. Mô hình miền và độ bền

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.

Cuối cùng, chúng tôi đã thảo luận về những lý do có thể buộc chúng tôi chọn Spring làm khuôn khổ lựa chọn cho Java.

Tuy nhiên, chúng ta nên kết thúc bài viết này với một lời khuyên. Tuy nhiên nghe có vẻ hấp dẫn, thường không có giải pháp duy nhất, một kích thước phù hợp với tất cả trong phát triển phần mềm.

Do đó, chúng ta phải vận dụng sự khôn ngoan của mình trong việc lựa chọn giải pháp đơn giản nhất cho các vấn đề cụ thể mà chúng ta muốn giải quyết.