当我使用Spring Framework时,我使用Java注释将类标记为控制器,使用@RequestMapping()等方法。我很困惑哪个类读取这些Anotations以及使用了什么技术。我正在考虑Java Reflection。是对的吗?
是的,Spring使用Java Reflection来评估您在annoations中提供的信息,并负责正确的配置。在@RequestMapping
Spring MVC和Spring WebFlux的情况下,两者都支持这个注释(参见here)。
摘抄:
Spring MVC和Spring WebFlux都通过RequestMappingHandlerMapping和RequestMappingHandlerAdapter在它们各自的模块和包结构中支持这个注释......
是的,不是,Spring当然使用反射来使用注释中的数据,但真正的魔力是HandlerMapping和HandlerAdapter的角色,它提供来自url和控制器(HandlerMapping)的映射,并使特定的servlet请求和响应适应你的控制器方法。在partucular中,如果您使用@EnableWebMvc或者,则在Spring启动应用程序或lagacy spring应用程序中自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter。这些是通过反射给你的sprign神奇的豆子。即使我建议使用在函数式编程中声明的端点,它甚至可以在Spring WebFlux中工作
简而言之,Spring有一个名为BeanPostProcessor的概念,负责(隐式或显式)处理注释或通常对spring bean的任何工作/修改。
Spring框架支持许多注释,一些仅用于Web,另一些用于缓存或调度,spring本身由许多框架组成,这些框架有助于不同的领域。
当加载应用程序上下文时,这些bean后处理器也会被spring识别出来(技术上它们就像其他spring bean一样,但是因为它们实现了org.springframework.beans.factory.config.BeanPostProcessor
接口spring,所以它们的处理方式不同,尽管它们也将它们放到应用程序上下文中。
因此,为每个bean调用这些BPP并允许修改bean。
通常,每个BPP执行以下操作之一:
java.lang.reflect.Proxy
或cglib
完成。或者在某些bean后处理器中,使用spring aop的编程访问来实现相同的效果。由于没有为每个bean创建代理,因此应该“分析”bean,并且只有在bean或其方法上显示某些注释时,bean才会被BPP处理。此分析由每个Bean Post处理器完成。@Autowired
以这种方式工作。@Scheduled
注释,spring将创建一个计时器,在不同的线程中,它将定期调用标记有此注释的方法。您可以在spring文档或this question中阅读更多相关信息