1

你喜欢哪个?在 spring mvc 中,它们@Controller用于所有Controller类。他们可以使用一些标记界面吗?他们为什么选择注释方法?更好的是,它们可以有类似的东西controller-scancomponent-scan因此包中的任何类都可以假定为 Controller 类。同样可以在xml中定义service-scanrepository-scan

4

2 回答 2

7

我认为从技术上讲,标记界面可能会产生相同的效果。问题是标记接口仅限于类,不能用于属性或方法。

Spring 使用注解将元数据添加到属性(例如@Autowired)或方法(例如@RequestMapping@Transactional)。因此使用相同的方法将元数据添加到类是一致的(例如@Controller@Service

请注意,Spring 不会强制您使用提供的注释。@Controller并且@RequestMapping只是定义处理程序映射的默认方式。理论上,您可以想出自己的方式将传入请求映射到方法调用。

于 2012-12-16T13:12:34.890 回答
3

它们最初都用于相同的目的。标记和发现某事。

注释是为了更直接地标记。标记接口实际上定义了一种类型,但是当您声明该类型的变量时,您将无能为力。注释不会创建类型,而是由处理注释的代码来赋予它含义。

最终,这是一个品味问题。

注释确实具有能够存储额外元数据的优势。就像在@Named("foo") 中一样。标记接口的优点是您可以创建保证所有项目都具有标记接口的集合。例如,没有约束说一个泛型或变量类型应该有一个特定的注解。

对于方法与接口中的方法的注释,存在接口中的方法需要实现(在 Java 8 中不再严格要求实现)的问题,这使得类很快变得笨拙,而注释可以更容易地点菜应用,但编译器可以'不强制执行正确的方法签名。这意味着某些注释需要say void foo(Bar bar) 的方法签名,但必须在文档中查找这一事实(如果有的话)。

于 2012-12-25T10:38:51.723 回答