Anotasi Kacang Musim Bunga

Artikel ini adalah sebahagian daripada siri: • Anotasi Inti Musim Semi

• Anotasi Web Spring

• Anotasi Boot Musim Semi

• Anotasi Penjadualan Musim Bunga

• Anotasi Data Musim Semi

• Anotasi Kacang Musim Bunga (artikel semasa)

1. Gambaran keseluruhan

Dalam artikel ini, kita akan membincangkan anotasi kacang Spring yang paling biasa digunakan untuk menentukan pelbagai jenis kacang.

Terdapat beberapa cara untuk mengkonfigurasi kacang dalam bekas Spring. Kami dapat menyatakannya menggunakan konfigurasi XML. Kami boleh menyatakan kacang menggunakan anotasi @Bean di kelas konfigurasi.

Atau kita boleh menandakan kelas dengan salah satu anotasi dari pakej org.springframework.stereotype dan meninggalkan yang lain untuk pengimbasan komponen.

2. Pengimbasan Komponen

Musim bunga secara automatik dapat mengimbas bungkusan kacang jika pengimbasan komponen diaktifkan.

@ComponentScan mengkonfigurasi pakej mana untuk mengimbas kelas dengan konfigurasi anotasi . Kita boleh menentukan nama-nama pakej asas langsung dengan salah satu daripada basePackages atau nilai hujah ( nilai adalah alias untuk basePackages ):

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

Juga, kita dapat menunjukkan kelas dalam pakej asas dengan argumen basePackageClasses :

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

Kedua-dua argumen adalah tatasusunan sehingga kami dapat menyediakan beberapa pakej untuk masing-masing.

Sekiranya tidak ada argumen yang ditentukan, pengimbasan berlaku dari pakej yang sama dengan kelas anotasi @ComponentScan .

@ComponentScan memanfaatkan ciri anotasi berulang Java 8, yang bermaksud kita dapat menandakan kelas dengannya berkali-kali:

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

Sebagai alternatif, kita boleh menggunakan @ComponentScans untuk menentukan beberapa konfigurasi @ComponentScan :

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

Semasa menggunakan konfigurasi XML , pemindaian komponen konfigurasi semudah itu:

3. @ Komponen

@Component adalah anotasi peringkat kelas. Semasa imbasan komponen, Spring Framework secara automatik mengesan kelas yang diberi anotasi dengan @Component .

Sebagai contoh:

@Component class CarUtility { // ... }

Secara lalai, contoh kacang kelas ini mempunyai nama yang sama dengan nama kelas dengan huruf kecil. Selain itu, kita dapat menentukan nama yang berbeza dengan menggunakan argumen nilai pilihan dari anotasi ini.

Oleh kerana @Repository , @Service , @Configuration , dan @Controller adalah semua anotasi meta @Component , mereka mempunyai tingkah laku penamaan kacang yang sama. Juga, Spring mengambilnya secara automatik semasa proses pengimbasan komponen.

4. @Rositori

Kelas DAO atau Repositori biasanya mewakili lapisan akses pangkalan data dalam aplikasi, dan harus diberi anotasi dengan @Repository:

@Repository class VehicleRepository { // ... }

Salah satu kelebihan menggunakan anotasi ini ialah terjemahannya membolehkan pengecualian ketekunan automatik diaktifkan . Semasa menggunakan kerangka ketekunan seperti Hibernate, pengecualian asli yang dilemparkan dalam kelas yang diberi anotasi dengan @Repository secara automatik akan diterjemahkan ke dalam subkelas Spring DataAccessExeption .

Untuk membolehkan terjemahan pengecualian , kita perlu menyatakan kacang PersistenceExceptionTranslationPostProcessor kita sendiri :

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

Perhatikan, bahawa dalam kebanyakan kes, Spring melakukan langkah di atas secara automatik.

Atau, melalui konfigurasi XML:

5. @ Perkhidmatan

The business logic of an application usually resides within the service layer – so we'll use the @Service annotation to indicate that a class belongs to that layer:

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

6. @Controller

@Controller is a class level annotation which tells the Spring Framework that this class serves as a controller in Spring MVC:

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

7. @Configuration

Configuration classes can contain bean definition methods annotated with @Bean:

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

8. Stereotype Annotations and AOP

When we use Spring stereotype annotations, it's easy to create a pointcut that targets all classes that have a particular stereotype.

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 pengimbasan komponen untuk memberitahu bekas tempat mencari kelas yang diberi anotasi.

Akhirnya - kami melihat bagaimana anotasi ini membawa kepada reka bentuk yang bersih dan berlapis dan pemisahan antara masalah aplikasi. Mereka juga membuat konfigurasi lebih kecil, kerana kita tidak perlu lagi secara jelas menentukan kacang secara manual.

Seperti biasa, contohnya terdapat di GitHub.

« Anotasi Data Musim Semi Sebelumnya