@Controller
类使用Controller
。他们可以使用一些标记界面吗?他们为什么选择注释方法?
更好的是,它们可以具有类似于controller-scan
的类似component-scan
的内容,因此可以将包中的任何类假定为Controller类。同样,service-scan
和repository-scan
可以在xml中定义。
答案 0 :(得分:7)
我认为技术上标记界面可以产生相同的效果。问题是标记接口仅限于类,不能用于属性或方法。
Spring正在使用注释将元数据添加到属性(例如@Autowired
)或方法(例如@RequestMapping
或@Transactional
)。因此,使用相同的方法将元数据添加到类(例如@Controller
或@Service
)
请注意,Spring不会强制您使用提供的注释。 @Controller
和@RequestMapping
只是定义处理程序映射的默认方式。从理论上讲,您可以采用自己的方式将传入的请求映射到方法调用。
答案 1 :(得分:3)
他们最初都服务于同一目的;标记和发现某事。
注释是为了更直接地标记。标记接口实际上定义了一个类型,但是当你声明一个所述类型的变量时,你无法用它做任何事情。注释不会创建类型,而是由处理注释的代码来赋予它意义。
最终这是一个品味问题。
注释确实具有能够存储其他元数据的优势。和@Named一样(" foo")。标记界面的优点是您可以创建集合,以确保所有项目都具有标记接口。例如。没有约束表示泛型或变量类型应该具有特定的注释。
对于接口中方法与方法的注释,接口中的方法需要实现的问题(在Java 8中不再严格要求这样做)使类快速笨重,而注释可以更容易应用点菜,但编译器不能强制执行正确的方法签名。这意味着某些注释需要一个方法签名,例如void foo(Bar bar),但是这个事实必须在docs中查找(如果有的话)。