Java注释如何在Spring Framework中工作[重复]

问题描述 投票:0回答:3

当我使用Spring Framework时,我使用Java注释将类标记为控制器,使用@RequestMapping()等方法。我很困惑哪个类读取这些Anotations以及使用了什么技术。我正在考虑Java Reflection。是对的吗?

java spring annotations
3个回答
0
投票

是的,Spring使用Java Reflection来评估您在annoations中提供的信息,并负责正确的配置。在@RequestMapping Spring MVC和Spring WebFlux的情况下,两者都支持这个注释(参见here)。

摘抄:

Spring MVC和Spring WebFlux都通过RequestMappingHandlerMapping和RequestMappingHandlerAdapter在它们各自的模块和包结构中支持这个注释......


0
投票

是的,不是,Spring当然使用反射来使用注释中的数据,但真正的魔力是HandlerMapping和HandlerAdapter的角色,它提供来自url和控制器(HandlerMapping)的映射,并使特定的servlet请求和响应适应你的控制器方法。在partucular中,如果您使用@EnableWebMvc或者,则在Spring启动应用程序或lagacy spring应用程序中自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter。这些是通过反射给你的sprign神奇的豆子。即使我建议使用在函数式编程中声明的端点,它甚至可以在Spring WebFlux中工作


0
投票

简而言之,Spring有一个名为BeanPostProcessor的概念,负责(隐式或显式)处理注释或通常对spring bean的任何工作/修改。

Spring框架支持许多注释,一些仅用于Web,另一些用于缓存或调度,spring本身由许多框架组成,这些框架有助于不同的领域。

当加载应用程序上下文时,这些bean后处理器也会被spring识别出来(技术上它们就像其他spring bean一样,但是因为它们实现了org.springframework.beans.factory.config.BeanPostProcessor接口spring,所以它们的处理方式不同,尽管它们也将它们放到应用程序上下文中。

因此,为每个bean调用这些BPP并允许修改bean。

通常,每个BPP执行以下操作之一:

  • 将初始bean包装到代理中以提供其他功能。代理通常使用java.lang.reflect.Proxycglib完成。或者在某些bean后处理器中,使用spring aop的编程访问来实现相同的效果。由于没有为每个bean创建代理,因此应该“分析”bean,并且只有在bean或其方法上显示某些注释时,bean才会被BPP处理。此分析由每个Bean Post处理器完成。
  • 修改Bean,设置其依赖关系等。例如,@Autowired以这种方式工作。
  • 部署其他代码只是因为bean包含注释,例如,如果你放置@Scheduled注释,spring将创建一个计时器,在不同的线程中,它将定期调用标记有此注释的方法。

您可以在spring文档或this question中阅读更多相关信息

© www.soinside.com 2019 - 2024. All rights reserved.