Spring中的框架类是什么,可以区分@ Controller,@ Service,@ Repository的功能

时间:2019-03-29 15:23:51

标签: spring-annotations

我想了解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 "";
}

由于这些注释的源代码相同,因此它们在框架类中的功能(由于每个人有不同的用例)是不同的(否则框架允许用户互换使用这些注释)。

1 个答案:

答案 0 :(得分:0)

  

我想了解Spring框架中的哪个类与众不同   @ Controller,@ Service,@ Repository批注的功能。在   比较这三个注释的源代码可以理解,只有   类名不同。

用法有细微差别,通常可以通过搜索引用来找到答案(例如in Eclipse

例如,RequestMappingHandlerMapping中专门引用了@Controller

  

说,Spring如何理解StudentController只是Controller   而不是服务或存储库?

管道知道如何处理特定注释。要直接回答您的问题:它知道StudentController@Controller,因为您已对此进行了注释。它没有注释为@Repository,因此它不是存储库。

@Controller本身有一个RetentionType.RUNTIME,以便Spring可以使用反射对其进行检查/检查。

最后,请注意,@Controller(以及您提到的其他构造型)本身就是@Components。因此标记为@Controller 的类型也隐含地也是@Component