@Controller
的定义如下:
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;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
从定义可以看出来,@Controller
只能使用在类级别。并且有一个参数。 被@Controller
修饰的类,在正确的配置下,可以被Spring MVC
正确解析为一个Controller
。
@Service
的定义如下:
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;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
String value() default "";
}
从定义可以看出来,@Service
只能使用在类级别。并且有一个参数。 被@Service
修饰的类,在正确的配置下,可以被Spring MVC
正确解析为一个Service
。
@Repository
的定义如下:
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;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
String value() default "";
}
从定义可以看出来,@Repository
只能使用在类级别。并且有一个参数。 被@Repository
修饰的类,在正确的配置下,可以被Spring MVC
正确解析为一个Repository
。
@Component
的定义如下:
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;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {
String value() default "";
}
从定义可以看出来,@Component
只能使用在类级别。并且有一个参数。 被@Component
修饰的类,在正确的配置下,可以被Spring MVC
正确解析为一个Component
。
从源代码可以看出来,@Service
、@Service
、@Repository
、@Component
的实现几乎一样,只是语义不同。
控制层(@Service
)、业务逻辑层(@Service
)、持久层(@Repository
,相当于DAO
), 当无法确定是哪一层的时候,就可以认为是@Component
。