当我使用Spring Framework时,我使用Java注释将一个类标记为控制器,使用@RequestMapping()的方法等等。我对哪个类阅读这些注释以及使用哪种技术感到困惑。我在考虑Java反射。是吗?
答案 0 :(得分:0)
是的,Spring使用Java Reflection来评估您在注释中提供的信息,并进行适当的配置。对于@RequestMapping
的Spring MVC和Spring WebFlux,都支持此注释(请参见here)。
节选:
Spring MVC和Spring WebFlux都通过各自模块和包结构中的RequestMappingHandlerMapping和RequestMappingHandlerAdapter来支持此批注...
答案 1 :(得分:0)
是(不是),Spring当然使用反射以便在批注中使用数据,但真正的魔力是HandlerMapping和HandlerAdapter的作用,它们提供来自url和控制器的映射(HandlerMapping)并适应特定的servlet请求并响应您的控制器方法。特别是,如果您使用@EnableWebMvc或,则在spring boot应用程序或lagacy spring应用程序中会自动注册一个RequestMappingHandlerMapping和RequestMappingHandlerAdapter。这些是通过反射使您发疯的魔力豆。即使我建议使用函数式编程中声明的端点,它也可以在Spring WebFlux中使用
答案 2 :(得分:0)
简而言之,Spring具有一个称为 BeanPostProcessor 的概念,该概念(隐式或显式)负责处理注释或通常对Spring bean的任何工作/修改。
spring框架支持许多注释,其中一些注释仅用于Web,其他注释用于缓存或调度,spring本身由许多在不同领域提供帮助的框架组成。
当加载应用程序上下文时,这些bean后处理器也会被spring识别(从技术上讲,它们与其他spring bean一样,但是由于它们实现了org.springframework.beans.factory.config.BeanPostProcessor
接口,因此spring将它们区别对待,尽管也将它们置于应用程序上下文中)
因此,每个BEP都会调用这些BPP,并允许修改该bean。
通常,每个BPP都执行以下操作之一:
将初始bean包装到代理中以提供其他功能。代理通常使用java.lang.reflect.Proxy
或cglib
完成。或者在某些bean后处理器中,可以通过编程方式访问spring aop以达到相同的效果。因为没有为每个bean创建代理,所以应该对bean进行“分析”,并且只有在bean或其方法上存在某些注释时,BPP才会对bean进行处理。此分析由每个Bean后处理器完成。
修改Bean,设置其依赖关系等。例如@Autowired
就是这种方式。
仅由于Bean包含注释而部署其他代码,例如,如果您放置@Scheduled
注释,spring将创建一个计时器,该计时器将在不同的线程中定期调用带有此注释标记的方法。 / p>
您可以在春季文档或this question
中了解更多信息。