21

我是弹簧框架的新手。在我看到的大部分 Spring 教程中,Spring 都被描述为“非侵入式”。

侵入性是什么意思?在 Java 中使用 Spring 的优点是什么,是什么使它成为非侵入性的?

4

9 回答 9

12

如果 IoC 容器具有侵入性,则意味着您的代码需要明确了解依赖注入。例如,在 Guice 中,您使用@Inject注释(和其他)。这些注释比以前更加标准化,这很好——这意味着通过一组注释,您可以(至少在理论上)使您的代码可用于各种不同的侵入式 IoC 容器。

使用非侵入式容器,您可以编写代码而根本不参考 IoC……一切都取决于对成员和注释的反射,即使您不使用 IoC 也会出现。

侵入式容器和非侵入式容器各有利弊——例如,更具体的代码可以让您更好地控制绑定的一些细节——但值得了解它们的区别。

于 2013-03-11T07:14:09.277 回答
4

检查http://forum.springsource.org/showthread.php?27846-Spring-is-non-invasive

它的真正含义是什么?

“您不必强制导入或扩展任何 Spring API,例如 Struts 会强制您扩展 Action”。

当然,在某些领域,比如web框架,是不可能避免依赖框架的应用代码的。但是 Spring 一直试图在配置管理方面达到非侵入性的理想状态

于 2013-03-11T07:16:30.917 回答
4

春天可以是侵入性的,也可以是非侵入性的,这完全取决于你。

Non-invansive spring 不使用注释(例如@Autowired)也不使用它自己的类(例如JdbcTemplate),它只使用配置将你的bean(简单的POJO)连接在一起(你仍然必须在你的代码中以某种方式初始化spring,无论如何,这有点侵入性)。但是你可以在没有任何重大代码更改的情况下自由地放弃 spring。另一方面,Invasive spring 为您提供模板类(用于持久性、Web 服务等)、注释和其他东西,如果不进行重构(如果您使用它们),您就不能简单地留下。

编辑:有人说弹簧不是侵入性的,因为它不会强迫您实现接口或扩展类。对我来说,一个框架不是侵入性的,如果它可以很容易地被替换的话。

于 2013-03-11T07:59:15.310 回答
4

大多数 Java 框架都强制您扩展它们的类之一或实现它们的接口之一。这种侵入式编程模型的示例是 EJB 2 时代的无状态会话 bean、早期版本的 Struts、WebWork、Tapestry。

Spring 避免使用其 API 乱扔代码。Spring 从不强迫您实现特定于 Spring 的接口或扩展特定于 Spring 的类。相反,这些类通常没有任何迹象表明它们正在被 Spring 使用。

public class HelloWorld {
    public String hello() {
      return "Hello World";
    }
}

这是一个简单的 Java 类 (POJO)。没有任何迹象表明它是 Spring 组件。Spring 是非侵入性的,这意味着此类在 Spring 应用程序中的功能与在非 Spring 应用程序中的功能相同。虽然 POJO 很简单,但它们可以很强大。

POJO 在 Spring 中变得强大的方法之一是使用依赖注入。

于 2016-02-15T16:02:22.193 回答
1

侵入性框架意味着您被迫扩展它们的类之一或实现它们的接口之一。您可以在 Struts 或 EJB2 等框架中看到这一点。Spring 是非侵入性的,因为它避免了这种情况。在最坏的情况下,一个类可能会使用 Spring 的注释之一进行注释,但否则它就是一个 POJO。所以只有你需要这样的 POJO:

package com.habuma.spring;
 public class HelloWorldBean {
  public String sayHello() {
return "Hello World";
 }
}
于 2018-12-03T21:06:18.360 回答
0

据说 Spring 框架是非侵入性的,这意味着它不会强制程序员从 Spring API 提供的任何预定义类或接口扩展或实现他们的类,在 struts 中我们曾经扩展 Action Class 权利,这就是为什么 struts 被称为具有侵略性。

在struts框架的情况下,它会强制程序员,程序员类必须从struts API提供的基类扩展。

于 2013-10-25T18:25:51.037 回答
0

使用@Resource 和@Inject 而不是@Component 和@Autowired。它非常有用,并且在 Spring 和 Guice 等 DI 框架中实现了标准化。

于 2017-03-08T05:13:12.950 回答
0

侵入性意义 - 非常迅速地传播到周围。Spring作者说EJB、Struts等框架充满了框架特定的代码,很难迁移到其他框架,这违背了Java的一次编写和随处运行的哲学。Spring 说它是非侵入性的,因为它使用 POJO 编写服务器端,因此可以迁移到任何平台。但正如至少 2 位贡献者在这篇文章中所建议的那样,春天是癌症,与它声称的相反

spring 对一个项目来说是一种癌症,一旦它感染了你的项目,如果不攻击 spring 配置文件,你就无法做任何事情......非侵入性在这方面非常具有误导性!– user177800 2013 年 3 月 11 日 7:18

于 2018-12-02T01:51:49.283 回答
0

声称 Spring 是非侵入性的,就像声称地球是平的一样。你完全否认现实,只基于你的个人偏见。

Spring 不仅侵入您的代码库,还侵入您的大脑。当您对在网上搜索信息和解决编程问题的解决方案建立了良好的信心时,这会让您非常恼火。我用大约 10 种语言和 shell 完成了认真的编程工作,并且几乎总是设法找到有用的信息、答案和提示来解决我的问题。通常我会设法很快找到一个不错的解决方案,有时需要一些挖掘。春天不是这样。一种曾经流行的脚本语言吹捧的口号是“不仅有办法做到这一点”。对于 Spring,您通常会发现许多不这样做的方法,或者许多在您的特定设置中不起作用的方法。

I do not doubt that Spring has real value. I do see that. But it comes with way too much magic, that works well as long as it works, but once it fails, the tooling and documentation often fail as well.

于 2020-02-20T06:53:59.847 回答