CDI关于堆栈溢出


CDI关于堆栈溢出我注意到的是反复出现的错误(或误解)是,人们不知道他们不应该实例化他们想要注入他们的依赖项的对象。

他们认为当他们这么做的时候Foo foo = new Foo()的依赖关系。Foo会在春天注射。不,他们不会的。这是于这样一个问题:

首先,也是最重要的--所有的Springbean都被管理--它们“活”在一个容器中,称为“应用程序上下文”。

其次,每个应用程序都有一个指向该上下文的入口点。Web应用程序有一个servlet,JSF使用一个el-解析器,等等。还有一个地方,应用程序上下文是引导的,所有bean都是自动加载的。在Web应用程序中,这可以是一个启动监听器。

自动装配是通过将一个bean的实例放入另一个bean实例中所需的字段来实现的。这两个类都应该是bean,也就是说,它们应该被定义为存在于应用程序上下文中。

应用程序上下文中的“生活”是什么?这意味着上下文实例化对象,而不是您。也就是说,你从来没有做过新的UserServiceImpl()-容器找到每个注入点并在那里设置一个实例。

所以不要自己实例化对象。将它们配置为由Spring实例化(通过XML、注释或java配置)。

https://www.imdb.com/list/ls508589799/

(FYI:有一种方法可以将依赖项注入到由用户而不是容器实例化的对象中。简而言之,它使用AspectJ编织:它进行字节码修改,以便每当一个对象被实例化时,它就由容器来管理。但这是“黑魔法”,在默认情况下不是“开启”。而且在许多DI框架中肯定不支持它)

他们说,开发Java是缓慢的,因为臃肿的应用服务器-您必须重新部署应用程序,以查看您的变化。PHP、Python等脚本语言允许您“保存和刷新结了“神话”。

是的,这是个神话。您也可以在java web应用程序中使用“保存和刷新”。JVM有所在运行时替换类。因此,您只需在调试模式下启动服务器(在调试模式下可以使用hotswap功能)并复制类文件。对于Eclipse,可以(至少)以两种方式完成:

  • WTP-将“部署程序集”配置为将已编译的类发送到Web-INF/class
  • Eclipse插件-将其配置为将编译好的类发送到绝对路径(Tomcat居住的地方)

https://www.douban.com/note/814495578/

我已经对如何使用它们做了更广泛的

当然,这里有个陷阱。你不能交换结构变化。如果添加新类、新方法、更改方法参数、添加字段、添加注释,则在运行时不能交换这些参数。但是,“保存和刷新”通

https://www.jianshu.com/p/7d80d0dfd79b

常只涉及更改方法中的一行。结构变化比较少见,在某些情况下意味着整个应用程序必须重新初始化。您也不能进行hotswap配置--您的应用程序通常是在某个(.xml)文件中配置的,所以如果您更改了它,就必须重新部署。但是,这似乎是一个很普通的场景--你的应用程序不能只是在运行时加载它的引导配置。

更常见的情况是html&CSS更改。没有“保存和更新”,你就活不下去了。但是这非常好--JSP由servlet容器刷新(除非您处于生产模式),而且每种视图技术都有一个动态选择模板文件的选项。这与JVM无关。

所以你使用Java开发Web应用程序的速度几乎与任何脚本语言一样快。

最后,我必须提到一个口号为“停止在Java中重新部署”的产品。他们创造了一个非常好的产品,这是一个改进的Hot-Sup-它也可以交换结构变化。并且支持许多框架起来真的很好。虽然这是一个伟大的产品,但我不会说它是必须的。没有它你会很有效率。

但是,无论是HotSwing还是JRebel--您必须确保不重新部署以反映更改。这才是真正的生产力杀手

相关