Anotasi Spring Bean

Artikel ini bagian dari serial: • Spring Core Annotations

• Anotasi Web Musim Semi

• Anotasi Spring Boot

• Penjadwalan Penjadwalan Musim Semi

• Anotasi Data Musim Semi

• Anotasi Spring Bean (artikel saat ini)

1. Ikhtisar

Di artikel ini, kita akan membahas anotasi kacang musim semi yang paling umum digunakan untuk menentukan berbagai jenis kacang.

Ada beberapa cara untuk mengkonfigurasi kacang dalam wadah Spring. Kita bisa mendeklarasikannya menggunakan konfigurasi XML. Kita bisa mendeklarasikan kacang menggunakan anotasi @Bean di kelas konfigurasi.

Atau kita bisa menandai kelas dengan salah satu anotasi dari paket org.springframework.stereotype dan menyerahkan sisanya ke pemindaian komponen.

2. Pemindaian Komponen

Spring dapat secara otomatis memindai paket untuk mencari kacang jika pemindaian komponen diaktifkan.

@ComponentScan mengonfigurasi paket mana yang akan dipindai untuk kelas dengan konfigurasi anotasi . Kita dapat menentukan nama paket dasar secara langsung dengan salah satu argumen basePackages atau nilai ( nilai adalah alias untuk basePackages ):

@Configuration @ComponentScan(basePackages = "com.baeldung.annotations") class VehicleFactoryConfig {}

Juga, kita bisa menunjuk ke kelas dalam paket dasar dengan argumen basePackageClasses :

@Configuration @ComponentScan(basePackageClasses = VehicleFactoryConfig.class) class VehicleFactoryConfig {}

Kedua argumen tersebut adalah array sehingga kami dapat menyediakan beberapa paket untuk masing-masingnya.

Jika tidak ada argumen yang ditentukan, pemindaian akan terjadi dari paket yang sama tempat kelas beranotasi @ComponentScan ada.

@ComponentScan memanfaatkan fitur anotasi berulang Java 8, yang berarti kita dapat menandai kelas dengannya beberapa kali:

@Configuration @ComponentScan(basePackages = "com.baeldung.annotations") @ComponentScan(basePackageClasses = VehicleFactoryConfig.class) class VehicleFactoryConfig {}

Atau, kita dapat menggunakan @ComponentScans untuk menentukan beberapa konfigurasi @ComponentScan :

@Configuration @ComponentScans({ @ComponentScan(basePackages = "com.baeldung.annotations"), @ComponentScan(basePackageClasses = VehicleFactoryConfig.class) }) class VehicleFactoryConfig {}

Saat menggunakan konfigurasi XML , pemindaian komponen konfigurasi sama mudahnya:

3. @Komponen

@Component adalah anotasi tingkat kelas. Selama pemindaian komponen, Spring Framework secara otomatis mendeteksi kelas yang dianotasi dengan @Component .

Sebagai contoh:

@Component class CarUtility { // ... }

Secara default, instance kacang dari kelas ini memiliki nama yang sama dengan nama kelas dengan inisial huruf kecil. Selain itu, kita dapat menentukan nama yang berbeda menggunakan argumen nilai opsional dari anotasi ini.

Karena @Repository , @Service , @Configuration , dan @Controller semuanya adalah meta-anotasi dari @Component , mereka berbagi perilaku penamaan kacang yang sama. Selain itu, Spring secara otomatis mengambilnya selama proses pemindaian komponen.

4. @Repositori

Kelas DAO atau Repositori biasanya mewakili lapisan akses database dalam aplikasi, dan harus dianotasi dengan @Repository:

@Repository class VehicleRepository { // ... }

Satu keuntungan menggunakan anotasi ini adalah terjemahan pengecualian ketekunan otomatis diaktifkan . Saat menggunakan kerangka kerja persistensi seperti Hibernate, pengecualian asli yang dilemparkan dalam kelas yang dianotasi dengan @Repository akan secara otomatis diterjemahkan ke dalam subkelas DataAccessExeption Spring .

Untuk mengaktifkan terjemahan pengecualian , kita perlu mendeklarasikan kacang PersistenceExceptionTranslationPostProcessor kita sendiri :

@Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { return new PersistenceExceptionTranslationPostProcessor(); }

Perhatikan, bahwa dalam banyak kasus, Spring melakukan langkah di atas secara otomatis.

Atau, melalui konfigurasi XML:

5. @Layanan

The logika bisnis dari aplikasi biasanya berada di dalam lapisan layanan - jadi kita akan menggunakan @Service penjelasan untuk menunjukkan bahwa kelas milik lapisan yang:

@Service public class VehicleService { // ... }

6. @ Pengontrol

@Controller adalah anotasi tingkat kelas yang memberi tahu Spring Framework bahwa kelas ini berfungsi sebagai pengontrol di Spring MVC :

@Controller public class VehicleController { // ... }

7. @Konfigurasi

Kelas konfigurasi dapat berisi metode definisi kacang yang dianotasi dengan @Bean :

@Configuration class VehicleFactoryConfig { @Bean Engine engine() { return new Engine(); } }

8. Anotasi Stereotipe dan AOP

Saat kami menggunakan anotasi stereotip Spring, mudah untuk membuat titik potong yang menargetkan semua kelas yang memiliki stereotip tertentu.

For example, suppose we want to measure the execution time of methods from the DAO layer. We'll create the following aspect (using AspectJ annotations) taking advantage of @Repository stereotype:

@Aspect @Component public class PerformanceAspect { @Pointcut("within(@org.springframework.stereotype.Repository *)") public void repositoryClassMethods() {}; @Around("repositoryClassMethods()") public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.nanoTime(); Object returnValue = joinPoint.proceed(); long end = System.nanoTime(); String methodName = joinPoint.getSignature().getName(); System.out.println( "Execution of " + methodName + " took " + TimeUnit.NANOSECONDS.toMillis(end - start) + " ms"); return returnValue; } }

In this example, we created a pointcut that matches all methods in classes annotated with @Repository. We used the @Around advice to then target that pointcut and determine the execution time of the intercepted methods calls.

Using this approach, we may add logging, performance management, audit, or other behaviors to each application layer.

9. Conclusion

In this article, we have examined the Spring stereotype annotations and learned what type of semantics these each represent.

Kami juga belajar bagaimana menggunakan pemindaian komponen untuk memberi tahu container di mana menemukan class beranotasi.

Terakhir - kami melihat bagaimana anotasi ini mengarah pada desain yang bersih dan berlapis serta pemisahan antara masalah aplikasi. Mereka juga membuat konfigurasi lebih kecil, karena kita tidak perlu lagi mendefinisikan kacang secara manual.

Seperti biasa, contoh tersedia di GitHub.

« Anotasi Data Musim Semi Sebelumnya