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