spring-projects / spring-loaded

Java agent that enables class reloading in a running JVM
Apache License 2.0
2.72k stars 515 forks source link

spring-loaded does not support the @RequestMapping annotation! #200

Closed zhang13690 closed 7 years ago

zhang13690 commented 7 years ago

I used the SpringMVC framework. If I add a request method with the '@RequestMapping' annotaion, the spring-loaded dose not work.

lanmolsz commented 7 years ago

You need to restart your application

zhang13690 commented 7 years ago

@lanmolsz, The purpose of spring-loaded is , we do not need to restart applications.

lanmolsz commented 7 years ago

sorry,I can't express it in English

看你也是中国人,就直接用中文回你。


spring-loaded不是不支持@RequestMapping注解。而是你可能不熟悉spring-mvc的初始化过程。所以我们先大致搞明白spring-mvc的初始化过程和路由逻辑,然后再来解释它为什么不工作就会很容易了。

对于程序来讲,你所有的类信息都可以看作程序的一些元数据,spring-mvc在启动的时候通过反射获取到这些元数据,并将其缓存成某种数据结构,而初始化操作只会在启动的时候执行一次,后续处理请求路由到你的业务方法都是通过取读取这个缓存的数据,反射调用。

很显然,你后面添加的@RequestMapping并不会触发spring-mvc的初始化操作,那么新添加的代码无法生效也不足为奇了。

如何将新增的方法应用在程序中?其实wiki里面是提到过怎么做的? 你可以通过编写一个插件,实现org.springsource.loaded.ReloadEventProcessorPlugin,并注册SpringLoadedPreProcessor.registerGlobalPlugin(plugin),你自定义编写插件会在spring-loaded重新加载时被调用。

zhang13690 commented 7 years ago

@lanmolsz 感谢你细致的解答,小生佩服。