Spring开发人员不推荐使用Bean自动连线的哪种方式?为什么?
(我是说为什么他们不建议使用@Autowired)
当我们为Spring指定它应该嵌入到其他类中的bean时,例如,我们使用@Autowired。
但不建议使用此注释,但建议使用数据绑定为什么?。
这是以下作为补充的回答(可能与主要问题间接相关)...
谁能解释这个问题中的陷阱,以及在构造函数或setter上设置注释@Autowired有什么不同,在哪种情况下更可取?
Spring团队在他们的文档中有一个很好的解释,其中写道:
基于构造函数还是基于setter的DI?
由于您可以混合使用基于构造函数和基于setter的DI,因此对于强制依赖项使用构造函数,对于可选依赖项使用setter方法或配置方法是一个很好的经验法则。注意,在setter方法上使用@Required注释可以使属性成为必需的依赖项;不过,最好是使用带有参数编程验证的构造函数注入。
Spring团队通常提倡构造函数注入,因为它允许您将应用程序组件作为不可变对象来实现,并确保所需的依赖项不为空。此外,构造函数注入的组件总是以完全初始化的状态返回给客户端(调用)代码。顺便说一句,大量构造函数参数是一种不好的代码气味,这意味着该类可能有太多的责任,应该重构以更好地解决关注点的正确分离。
setter注入应该主要用于可选的依赖项,这些依赖项可以在类中分配合理的默认值。否则,在代码使用依赖项的任何地方都必须执行非空检查。setter注入的一个好处是setter方法使该类的对象可以在以后重新配置或重新注入。因此,通过JMXMBeans进行管理是setter注入的一个引人注目的用例。
使用对特定类最有意义的DI样式。有时,在处理您没有来源的第三方类时,会为您做出选择。例如,如果第三方类不公开任何setter方法,那么构造函数注入可能是唯一可用的DI形式。
因此,一般来说,建议对必填字段使用构造函数注入,对可选字段使用setter注入,但要小心,因为如果使用setter注入,就放弃了不可变的优点。不鼓励的是明确的字段注入,因为它需要使用javahtml" target="_blank">反射机制来填充字段,这会导致代码与spring的机制紧密耦合,而且还会使单元测试变得更加困难,因为您无法如此轻松地通过构造函数或setter传递模拟对象。
问题内容: 我最近一直在使用Hibernate 3.5和Spring 3进行一些工作,但是我对Hibernate还是比较陌生,并认为Spring中的类使将Hibernate与我的域类一起使用变得容易且容易。 但是,在搜索一个不相关的问题时,我看到有人提到,这不是使用Spring和Hibernate的最佳方法。任何人都可以阐明以下几点: 为什么不推荐? 整合Hibernate和Spring的最佳方法
问题内容: Java文档似乎并未提及有关的弃用的任何内容,但我一直很早就听说过它的弃用情况。是因为它具有错误/错误而被弃用,还是整体上更好使用? 我有一些使用的代码,我想知道我是否应该认真考虑将其重构为使用,还是弃用纯粹是为了方便而我的代码是安全的。 问题答案: 从javadoc中获取StringTokenizer: 是旧类,出于兼容性原因保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人改
问题内容: 我找不到任何解释为什么Apache Lang3 v3.7中不推荐使用StringEscapeUtils。 https://commons.apache.org/proper/commons- lang/apidocs/org/apache/commons/lang3/StringEscapeUtils.html 我们现在应该使用什么来进行HTML转义/转义 问题答案: 班级已从包裹中移
问题内容: 为什么不推荐使用? 问题答案: 在javadoc中说为什么。被设计为低负载并发的一种简单解决方案,但它甚至无法解决: 请注意,SingleThreadModel不能解决所有线程安全问题。例如,即使使用SingleThreadModel servlet,会话属性和静态变量仍然可以同时由多个线程上的多个请求访问。建议开发人员采取其他方法解决这些问题,而不要实现此接口,例如,避免使用实例变量
问题内容: 考虑以下示例: 并且还请参见下面的示例,该示例创建了Tk背对背的实例,而不是一次创建,因此在任何给定时间都只有一个实例Tk: 为什么拥有多个实例被认为是不好的Tk? 第二个代码段是否被认为更好一些,还是遇到了与第一个代码相同的条件? 问题答案: 为什么拥有多个实例被认为是不好的Tk? Tkinter只是围绕导入Tk库的嵌入式Tcl解释器的python包装器。创建根窗口时,将创建Tcl解
问题内容: 我从没想过,只有我使用了返回一个字符数组的方法,并且看到该方法已被 弃用 。但是现在我想,为什么 不赞成使用 此方法? Java文档说明: 不推荐使用 。 从Java 2 Platform v1.2开始,由取代。 获取由组件表示的文本的一部分。如果length为0,则返回一个空字符串。 出于安全原因,不建议使用此方法。请改用该方法。 但是那些 安全原因是 什么?有什么想法吗? 先感谢您