According to the Spring docs,要启用带注释的控制器的自动检测,请在组件中添加组件扫描:
<context:component-scan base-package="org.springframework.samples.petclinic.web"/>
我的问题是,为什么这有必要?
如果一个控制器有一个注释已经指明它是什么,那么对于没有组件扫描的Spring来说,这应该不够吗?
答案 0 :(得分:5)
Spring怎么会找到这些课程?如果你还没有告诉Spring查看某个类或包,那些类就不会被加载,而Spring永远不会找到它们。
这更像是java类加载模型的限制(如果你可以称之为限制),那么它就是Spring的限制。
答案 1 :(得分:3)
您只需在配置中添加以下内容:
&LT;上下文:注解的配置/&GT;
如果只将注释放在类上,框架必须加载所有类以检查注释是否存在。
要最大限度地减少此开销,您必须在配置中添加annotation-config标记。这样,框架就知道必须检查该配置中的类。
您可以通过使用“base-package”属性指定带注释类的包来帮助框架。
// // EDIT
这也解释了the documentation中的注释:
注意强>
&LT;上下文:注解的配置/&GT;只要 在bean中查找bean上的注释 相同的应用程序上下文 被定义为。这意味着,如果你 投入一个 WebApplicationContext for a DispatcherServlet,它只检查 控制器中的@Autowired bean, 而不是你的服务。
答案 2 :(得分:1)
简单地使用@Controller
注释类并不一定意味着您希望它成为Spring上下文的一部分。想象一下,如果该类是另一个应用程序的一部分,或者是第三方库的一部分,或者是系统中不赞成的组件,等等。仅仅因为它位于类路径上并不一定意味着您希望它自动实例化为bean你的春天语境。