Я хочу понять, какой класс в среде Spring отличает функциональность аннотаций @Controller, @Service, @Repository.При сравнении исходного кода этих трех аннотаций стало понятно, что отличается только имя класса.
Скажите, как Spring понимает, StudentController является только Контроллером, а не Сервисом или Репозиторием?
@Controller
public class StudentController {
}
@Service
public class StudentService {
}
@Repository
public class StudentRepository {
}
Исходные коды аннотаций весенних стереотипов
Controller.class
package org.springframework.stereotype;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
Service.class
package org.springframework.stereotype;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
Repository.class
package org.springframework.stereotype;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
Поскольку исходный код для этих аннотаций одинаков, их функциональные возможности различаются (поскольку у каждого из них разные сценарии использования) в классах фреймворка где-либо, иначе фреймворк позволяет пользователямиспользуйте эти аннотации взаимозаменяемо.