Анотации на пролетен боб

Тази статия е част от поредица: • Spring Core Annotations

• Пролетни уеб анотации

• Анотации на пролетното зареждане

• Анотации за пролетно планиране

• Пролетни анотации на данни

• Анотации на Spring Bean (текуща статия)

1. Общ преглед

В тази статия ще обсъдим най- често срещаните анотации на пролетния боб, използвани за дефиниране на различни видове боб.

Има няколко начина за конфигуриране на боб в Spring контейнер. Можем да ги декларираме с помощта на XML конфигурация. Можем да декларираме боб, като използваме анотацията @Bean в конфигурационен клас.

Или можем да маркираме класа с една от анотациите от пакета org.springframework.stereotype , а останалите да оставим за сканиране на компоненти.

2. Сканиране на компоненти

Spring може автоматично да сканира пакет за зърна, ако е активирано сканирането на компоненти.

@ComponentScan конфигурира кои пакети да сканира за класове с конфигурация на анотации . Ние можем да посочите имената на база пакет директно с един от най- basePackages или стойност аргументи ( стойност е псевдоним на basePackages ):

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

Също така, можем да посочим класове в базовите пакети с аргумента basePackageClasses :

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

И двата аргумента са масиви, за да можем да предоставим множество пакети за всеки.

Ако не е посочен аргумент, сканирането се извършва от същия пакет, където присъства анотираният клас @ComponentScan .

@ComponentScan използва функцията за повтарящи се анотации на Java 8, което означава, че можем да маркираме клас с нея няколко пъти:

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

Като алтернатива можем да използваме @ComponentScans, за да зададем множество конфигурации @ComponentScan :

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

Когато използвате XML конфигурация , сканирането на компоненти за конфигуриране е също толкова лесно:

3. @ Компонент

@Component е анотация на ниво клас. По време на сканирането на компонентите Spring Framework автоматично открива класове, коментирани с @Component .

Например:

@Component class CarUtility { // ... }

По подразбиране екземплярите на bean на този клас имат същото име като името на класа с малки букви. На всичкото отгоре можем да посочим различно име, като използваме незадължителния аргумент стойност на тази анотация.

Тъй като @Repository , @Service , @Configuration и @Controller са всички мета-анотации на @Component , те споделят едно и също поведение на именуване на боб. Освен това Spring автоматично ги взима по време на процеса на сканиране на компонентите.

4. @ хранилище

Класовете DAO или Repository обикновено представляват слоя за достъп до базата данни в приложение и трябва да бъдат отбелязани с @Repository:

@Repository class VehicleRepository { // ... }

Едно от предимствата на използването на тази анотация е, че има активиран автоматичен превод на изключения за постоянство . Когато използвате рамка за устойчивост, като Hibernate, местните изключения, хвърлени в класове, анотирани с @Repository, ще бъдат автоматично преведени в подкласове на Spring's DataAccessExeption .

За да активираме превода на изключения , трябва да декларираме собствения си компонент PersistenceExceptionTranslationPostProcessor :

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

Имайте предвид, че в повечето случаи Spring прави стъпката по-горе автоматично.

Или чрез XML конфигурация:

5. @Service

В бизнес логиката на заявление обикновено пребивава в рамките на слой на услугата - така ще използваме @Service анотация за да покаже, че един клас принадлежи към този слой:

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

6. @Controller

@Controller е анотация на ниво клас, която казва на Spring Framework, че този клас служи като контролер в Spring MVC :

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

7. @ Конфигурация

Конфигурационните класове могат да съдържат методи за дефиниция на боб, анотирани с @Bean :

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

8. Стереотипни анотации и AOP

Когато използваме анотации за пролетни стереотипи, лесно е да създадем точка, която е насочена към всички класове, които имат определен стереотип.

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.

Също така научихме как да използваме сканиране на компоненти, за да кажем на контейнера къде да намери анотирани класове.

И накрая - видяхме как тези пояснения водят до изчистен, слоен дизайн и разделяне между проблемите на приложението. Те също така правят конфигурацията по-малка, тъй като вече не е необходимо изрично да дефинираме зърната ръчно.

Както обикновено, примерите са достъпни в GitHub.

« Предишни пролетни анотации на данни