我想了解Spring框架中的哪个类区分@ Controller,@ Service,@ Repository批注的功能。通过比较这三个注释的源代码,可以理解只有类名是不同的。
说,Spring如何理解 StudentController 仅是控制器,而不是Service或存储库?
@Controller
public class StudentController {
}
@Service
public class StudentService {
}
@Repository
public class StudentRepository {
}
Spring构造型注释的源代码
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 "";
}
由于这些注释的源代码相同,因此它们在框架类中的功能(由于每个人有不同的用例)是不同的(否则框架允许用户互换使用这些注释)。
答案 0 :(得分:0)
我想了解Spring框架中的哪个类与众不同 @ Controller,@ Service,@ Repository批注的功能。在 比较这三个注释的源代码可以理解,只有 类名不同。
用法有细微差别,通常可以通过搜索引用来找到答案(例如in Eclipse。
例如,RequestMappingHandlerMapping
中专门引用了@Controller
。
说,Spring如何理解StudentController只是Controller 而不是服务或存储库?
管道知道如何处理特定注释。要直接回答您的问题:它知道StudentController
是@Controller
,因为您已对此进行了注释。它没有注释为@Repository
,因此它不是存储库。
@Controller
本身有一个RetentionType.RUNTIME
,以便Spring可以使用反射对其进行检查/检查。
最后,请注意,@Controller
(以及您提到的其他构造型)本身就是@Component
s。因此标记为@Controller
的类型也隐含地也是@Component
。