Mengapa Memilih Spring sebagai Kerangka Java Anda?

1. Ikhtisar

Pada artikel ini, kita akan membahas proposisi nilai utama Spring sebagai salah satu framework Java paling populer.

Lebih penting lagi, kami akan mencoba memahami alasan Spring menjadi kerangka kerja pilihan kami. Detail Spring dan bagian-bagiannya telah dibahas secara luas dalam tutorial kami sebelumnya. Karenanya kita akan melewatkan bagian pengantar "bagaimana" dan sebagian besar berfokus pada "mengapa".

2. Mengapa Menggunakan Kerangka Apa Saja?

Sebelum kita memulai diskusi apa pun khususnya tentang Spring, pertama-tama mari kita pahami mengapa kita perlu menggunakan framework apa pun di tempat pertama.

Sebuah tujuan umum bahasa pemrograman seperti Java ini mampu mendukung berbagai aplikasi . Belum lagi Java secara aktif dikerjakan dan ditingkatkan setiap hari.

Selain itu, ada banyak sekali pustaka sumber terbuka dan berpemilik untuk mendukung Java dalam hal ini.

Jadi mengapa kita membutuhkan kerangka kerja? Sejujurnya, tidak mutlak perlu menggunakan kerangka kerja untuk menyelesaikan tugas. Namun, sering kali disarankan untuk menggunakannya karena beberapa alasan:

  • Membantu kami fokus pada tugas inti daripada pelat standar yang terkait dengannya
  • Menyatukan tahun kebijaksanaan dalam bentuk pola desain
  • Membantu kami mematuhi standar industri dan peraturan
  • Menurunkan total biaya kepemilikan untuk aplikasi

Kami baru saja menggores permukaannya di sini dan kami harus mengatakan bahwa manfaatnya sulit untuk diabaikan. Tapi tidak mungkin semuanya positif, jadi apa tujuannya:

  • Memaksa kami untuk menulis aplikasi dengan cara tertentu
  • Mengikat ke versi bahasa dan perpustakaan tertentu
  • Menambahkan ke footprint sumber daya aplikasi

Terus terang, tidak ada poin perak dalam pengembangan perangkat lunak dan kerangka kerja tentu tidak terkecuali. Jadi pilihan kerangka kerja mana atau tidak harus didorong dari konteksnya.

Mudah-mudahan, kami akan berada di posisi yang lebih baik untuk membuat keputusan ini sehubungan dengan Musim Semi di Jawa pada akhir artikel ini.

3. Tinjauan Singkat Ekosistem Mata Air

Sebelum kita memulai penilaian kualitatif Kerangka Musim Semi, mari kita lihat lebih dekat seperti apa ekosistem Spring itu.

Musim semi muncul di suatu tempat pada tahun 2003 pada saat Java Enterprise Edition berkembang pesat dan mengembangkan aplikasi perusahaan sangat mengasyikkan tetapi tetap membosankan!

Spring dimulai sebagai container Inversion of Control (IoC) untuk Java. Kami masih mengaitkan Spring sebagian besar dengan itu dan pada kenyataannya, itu merupakan inti dari kerangka kerja dan proyek lain yang telah dikembangkan di atasnya.

3.1. Kerangka Musim Semi

Kerangka pegas dibagi menjadi beberapa modul yang membuatnya sangat mudah untuk memilih dan memilih bagian yang akan digunakan dalam aplikasi apa pun:

  • Core: Menyediakan fitur inti seperti DI (Dependency Injection), Internasionalisasi, Validasi, dan AOP (Pemrograman Berorientasi Aspek)
  • Akses Data: Mendukung akses data melalui JTA (Java Transaction API), JPA (Java Persistence API), dan JDBC (Java Database Connectivity)
  • Web: Mendukung Servlet API (Spring MVC) dan Reactive API (Spring WebFlux), dan juga mendukung WebSockets, STOMP, dan WebClient
  • Integrasi: Mendukung integrasi ke Enterprise Java melalui JMS (Java Message Service), JMX (Java Management Extension), dan RMI (Remote Method Invocation)
  • Pengujian: Dukungan luas untuk pengujian unit dan integrasi melalui Objek Mock, Perlengkapan Uji, Manajemen Konteks, dan Caching

3.2. Proyek Musim Semi

Tapi yang membuat Spring jauh lebih berharga adalah ekosistem yang kuat yang telah tumbuh di sekitarnya selama bertahun-tahun dan terus berkembang secara aktif . Ini disusun sebagai proyek Musim Semi yang dikembangkan di atas kerangka Pegas.

Meskipun daftar proyek Musim Semi sangat panjang dan terus berubah, ada beberapa yang perlu disebutkan:

  • Boot: Memberi kami satu set template yang sangat beropini tetapi dapat diperluas untuk membuat berbagai proyek berdasarkan Spring dalam waktu hampir singkat. Itu membuatnya sangat mudah untuk membuat aplikasi Spring mandiri dengan Tomcat tertanam atau wadah serupa.
  • Cloud: Memberikan dukungan untuk dengan mudah mengembangkan beberapa pola sistem terdistribusi umum seperti penemuan layanan, pemutus sirkuit, dan gateway API. Ini membantu kami mengurangi upaya untuk menerapkan pola boilerplate seperti itu di platform lokal, jarak jauh, atau bahkan yang dikelola.
  • Keamanan: Menyediakan mekanisme yang kuat untuk mengembangkan otentikasi dan otorisasi untuk proyek berdasarkan Spring dengan cara yang sangat dapat disesuaikan. Dengan dukungan deklaratif minimal, kami mendapatkan perlindungan dari serangan umum seperti fiksasi sesi, pembajakan klik, dan pemalsuan permintaan lintas situs.
  • Seluler: Memberikan kemampuan untuk mendeteksi perangkat dan menyesuaikan perilaku aplikasi yang sesuai. Selain itu, mendukung manajemen tampilan sadar perangkat untuk pengalaman pengguna yang optimal, manajemen preferensi situs, dan pengalih situs.
  • Batch: Menyediakan kerangka kerja ringan untuk mengembangkan aplikasi batch untuk sistem perusahaan seperti pengarsipan data. Memiliki dukungan intuitif untuk penjadwalan, restart, melewatkan, mengumpulkan metrik, dan logging. Selain itu, mendukung penskalaan untuk pekerjaan volume tinggi melalui pengoptimalan dan partisi.

Tak perlu dikatakan bahwa ini adalah pengantar abstrak tentang apa yang ditawarkan Spring. Tapi itu memberi kita cukup dasar sehubungan dengan organisasi Spring dan luasnya untuk membawa diskusi kita lebih jauh.

4. Musim Semi Beraksi

Merupakan kebiasaan untuk menambahkan program hello-world untuk memahami teknologi baru apa pun.

Mari kita lihat bagaimana Spring dapat membuatnya menjadi cakewalk untuk menulis program yang melakukan lebih dari sekedar hello-world . Kami akan membuat aplikasi yang akan mengekspos operasi CRUD sebagai REST API untuk entitas domain seperti Karyawan yang didukung oleh database dalam memori. Terlebih lagi, kami akan melindungi titik akhir mutasi kami menggunakan autentikasi dasar. Terakhir, tidak ada aplikasi yang benar-benar dapat diselesaikan tanpa pengujian unit lama yang baik.

4.1. Pengaturan Proyek

Kami akan menyiapkan proyek Spring Boot kami menggunakan Spring Initializr, yang merupakan alat online yang nyaman untuk melakukan bootstrap proyek dengan dependensi yang tepat. Kami akan menambahkan Web, JPA, H2, dan Keamanan sebagai dependensi project untuk menyiapkan konfigurasi Maven dengan benar.

Detail lebih lanjut tentang bootstrap tersedia di salah satu artikel kami sebelumnya.

4.2. Model dan Persistensi Domain

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.

Terakhir, kami membahas alasan yang dapat memaksa kami untuk memilih Spring sebagai framework pilihan untuk Java.

Namun, kita harus mengakhiri artikel ini dengan catatan nasihat. Betapapun menariknya kedengarannya, biasanya tidak ada solusi tunggal yang cocok untuk semua dalam pengembangan perangkat lunak.

Oleh karena itu, kita harus menerapkan kebijaksanaan kita dalam memilih solusi paling sederhana untuk masalah spesifik yang ingin kita selesaikan.