Что такое каркасный класс в Spring, который отличает функциональность @Controller, @Service, @Repository - PullRequest
2 голосов
/ 29 марта 2019

Я хочу понять, какой класс в среде 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 "";
}

Поскольку исходный код для этих аннотаций одинаков, их функциональные возможности различаются (поскольку у каждого из них разные сценарии использования) в классах фреймворка где-либо, иначе фреймворк позволяет пользователямиспользуйте эти аннотации взаимозаменяемо.

1 Ответ

0 голосов
/ 02 апреля 2019

Я хочу понять, какой класс в среде Spring отличает функциональность аннотаций @Controller, @Service, @Repository.После сравнения исходного кода этих трех аннотаций понял, что отличается только имя класса.

Использование нюансов, и часто ваши ответы будут найдены путем поиска ссылок (например, в Eclipse .

Например, на @Controller имеется прямая ссылка в RequestMappingHandlerMapping.

Скажите, как Spring понимает, что StudentController является только контроллером, а неСлужба или репозиторий?

Сантехник знает, что делать с конкретными аннотациями. Чтобы ответить на ваш вопрос напрямую: он знает, StudentController - это @Controller, потому что вы его аннотировали. Он не аннотированкак @Repository, так что это не хранилище.

@Controller само по себе имеет RetentionType.RUNTIME, так что Spring может проверить / проверить его используя отражение .

Наконец, обратите внимание, что @Controller (и другие упомянутые вами стереотипы) сами по себе @Component s . Таким образом, тип помечен как @Controller неявно также @Component.

...