V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yanerweb
V2EX  ›  Java

Spring 是干什么的? 能具体举出一个例子吗?比如,写一个 留言板程序,会用到 Spring 吗?

  •  
  •   yanerweb · 2014-06-27 15:52:57 +08:00 · 8700 次点击
    这是一个创建于 3831 天前的主题,其中的信息可能已经有所发展或是发生改变。
    从2001年开始接触 Java,到现在为止,也不明白 Spring 具体在实际工作中是做什么的。
    比如,我写一个 留言板程序,或者 小型的CMS程序,或者最基础的 CRUD程序,Spring 在
    里面能干什么,谢谢。
    第 1 条附言  ·  2014-06-27 16:24:41 +08:00
    具体不明白的是: Spring 的 依赖注入 是干什么的?
    44 条回复    2014-10-14 05:52:42 +08:00
    qiayue
        1
    qiayue  
       2014-06-27 15:57:22 +08:00   ❤️ 1
    yanerweb
        2
    yanerweb  
    OP
       2014-06-27 16:03:14 +08:00
    @qiayue 谢谢,但本人只懂最基本的语法 Basic、PHP 的语法,Java 也是当 Basic 使用的。看不懂 Object、继承、注入什么的,特别是所谓的 ”依赖注入”。
    另外,基础过 .net 、php 、等等 web项目,也没有过依赖注入,网站照样跑跑的妥妥的。
    rails3
        3
    rails3  
       2014-06-27 16:09:42 +08:00   ❤️ 1
    rails3
        4
    rails3  
       2014-06-27 16:11:10 +08:00
    7个模块可能都会用到。
    yanerweb
        5
    yanerweb  
    OP
       2014-06-27 16:16:09 +08:00
    @rails3 谢谢,本人只懂 if 、else 、for 这3个语句,用这3个语句开发了很多网站。不知道 spring 的所谓依赖注入是什么概念? 我开发留言板的话,能用吗?用在哪?
    -----------------------------------------------------------------
    我现在的理解是: spring 的依赖注入,能帮你不用修改源码,就可以指定方法(接口)要执行哪些代码。
    -----------------------------------------------------------------
    但感觉,开发 留言板 用不上呀。难道好处就是不用修改 java源码,去修改 xml 吗?
    yanerweb
        6
    yanerweb  
    OP
       2014-06-27 16:17:19 +08:00
    本人问题可能有些宽泛了,我具体不明白的是 spring 的核心功能呢,就是那个所谓的 “依赖注入” 是干什么用?
    bigcoon
        7
    bigcoon  
       2014-06-27 16:19:23 +08:00   ❤️ 1
    你发帖子的时间不如百度一下,然后写个DEMO什么的。
    yanerweb
        8
    yanerweb  
    OP
       2014-06-27 16:21:52 +08:00
    @bigcoon 谢谢,本人只懂 java 的 if、else、for ,其他都不明白。但特别好奇大家总说的 spring 的 依赖注入,哈哈。百度上面都是 手册、例子也比较理论,我根本看不懂。
    lightening
        9
    lightening  
       2014-06-27 16:24:43 +08:00   ❤️ 2
    你接触 Java 13年了就只懂 if 、else 、for 这3个语句?!
    你怎么做到的?!
    yanerweb
        10
    yanerweb  
    OP
       2014-06-27 16:27:22 +08:00
    @lightening 谢谢,因为所开发的网站(貌似不管多复杂的网站 都是 if 和 for ),都是 数据库的 增删改,按照 2000年的 ASP、PHP 语言 和 VB语言的思路写就完成了,从来没有用 Spring 的 IOC,也许项目中有 Spring 的框架,但是也没有 修改过吧。
    Navee
        11
    Navee  
       2014-06-27 16:29:50 +08:00   ❤️ 1
    @lightening 隐隐约约感觉楼主是来黑spring的..
    楼主不要纠结spring是做什么的了
    spring能做的事情,你用java都能做.
    over
    rails3
        12
    rails3  
       2014-06-27 16:32:07 +08:00   ❤️ 1
    @yanerweb

    public class TestController {

    private ITestService testService;

    get method;

    set method;
    }


    TestServiceA, TestServiceB, TestServiceC 实现ITestService接口,testService属于三个实现类中的那个,由spring配置决定,这就是spring ioc
    incompatible
        13
    incompatible  
       2014-06-27 16:36:04 +08:00   ❤️ 1
    赞同11楼 @Navee
    的确spring并非不可或缺
    不过如果让我做留言板,起码事务管理和crud我会分别借助spring aop和spring jdbcTemplate实现

    楼主可以把自己代码放出来,我来告诉你到底哪一部分可以用得上spring以便节省你的工作量或者让你的代码变得优雅
    yanerweb
        14
    yanerweb  
    OP
       2014-06-27 16:36:58 +08:00
    @Navee 谢谢,您说的有道理,if、else 也能做。但特别好奇,大家总说的 SSH 中的 Spring 我一直也没有用到。开发留言板、开发表单提交,能用吗? 从事 Java 十几年了,如果我明白了 spring 的 IoC 是什么,就不会有遗憾了。
    Navee
        15
    Navee  
       2014-06-27 16:37:11 +08:00
    @incompatible 我觉得楼主的水平完全不用spring就能完成.
    WildCat
        16
    WildCat  
       2014-06-27 16:39:22 +08:00 via iPhone
    汗,01年就接触Java竟然不知道Spring…
    01年我小学三年级……
    yanerweb
        17
    yanerweb  
    OP
       2014-06-27 16:40:16 +08:00
    @rails3 谢谢,您的代码我大概能看懂,但不清楚这么做,IoC 能在 我开发留言板时候,有什么帮助?谢谢~~
    yanerweb
        18
    yanerweb  
    OP
       2014-06-27 16:46:52 +08:00
    我对 Spring 的 IoC 的总结是:
    ----------------------------------------------------------------------
    不用修改 源码,而是修改 xml ,来改变程序的运行逻辑
    ----------------------------------------------------------------------
    大家感觉对吗?精辟吗?
    xmuxsp
        19
    xmuxsp  
       2014-06-27 16:47:48 +08:00
    当你需要使用某个对象时,除了直接new一个,也可以假设你要的东西可以从当前类的构造函数的参数里去获得,不知道我理解的有没有错......
    9hills
        20
    9hills  
       2014-06-27 16:48:35 +08:00
    lz是来黑无误。。
    Navee
        21
    Navee  
       2014-06-27 16:48:49 +08:00   ❤️ 1
    @yanerweb 好比如你有两个类:
    class A {
    private B b = new B();
    }
    class B {
    public void sayHello(){
    System.out.println("hello");
    }
    }
    这是传统的实现,A类中要调用B类的方法,必须有B的实例,所以A里面就创建了一个B的实例
    下面说一下ioc是什么:
    如果用ioc 依赖注入的思维来想这个,那么A类是依赖与B类的,因为这个地方没有了B类,new B将会不成立,虽然有了依赖注入,这个地方也会不成立,所以和ioc一起使用的就是接口:
    class A {
    private IB b;
    }
    interface IB{
    public void sayHello();
    }
    class B implements IB{
    public void sayHello(){
    System.out.println("hello");
    }
    }
    现在这样A类就不依赖与B类了,而是依赖与IB接口,现在要做的就是,把B的实例注入到A的b属性中
    spring ioc在这段代码中的作用就是创建B实例,然后在创建A实例的时候将B的实例设置到A的属性b之中.
    注意,这里的B实例,A实例并不是类似与上面那样我们手动new一个,而是通过spring 的BeanFactory创建的.
    yanerweb
        22
    yanerweb  
    OP
       2014-06-27 16:54:15 +08:00
    @xmuxsp 谢谢,您的理解,我更加看不明白了。
    incompatible
        23
    incompatible  
       2014-06-27 16:54:48 +08:00
    @Navee 不过说句实在的,我在工程中从来没有遇到过不改代码只改xml就可以解决问题的情况
    尤其component-scan和@Autowired、@Qualifier开始流行以后,几乎也不用写xml了
    maikcn
        24
    maikcn  
       2014-06-27 16:55:09 +08:00
    Sping不能解决什么,它只能提供一种架构思维

    比如IoC,能让用家忽略我调用的对象是怎么来的,要怎么new,用完以后又怎么样(因为生存周期给Spring管理了)
    比如AOP,能让你忽然想在某个切面上添加一点小log而不用 find + replace 所有业务代码

    如果做留言板之类简单的CRUD什么的小应用,完全不用也没关系
    如果做分布式的大应用,那Spring提供了一些便于拆分和调用的思路和方法,当然不用Spring也完全可以有其他办法做到
    wenLiangcan
        25
    wenLiangcan  
       2014-06-27 16:56:51 +08:00   ❤️ 1
    推荐看看 Just Spring 这本书,很薄的,可能 60 页不到
    solupro
        26
    solupro  
       2014-06-27 17:01:24 +08:00
    说到依赖注入想到了一篇文章 http://coolshell.cn/articles/6950.html
    maikcn
        27
    maikcn  
       2014-06-27 17:02:57 +08:00
    这样说吧,我理解的 IoC

    就是可以让你代码中少写 new Object(xx,xx,xx) , 也能让系统运行时全局少一点用完即弃的对象,并且这些是面向接口的
    vicalloy
        28
    vicalloy  
       2014-06-27 17:12:31 +08:00
    楼主真是纯为黑spring而来的啊。
    就我感觉spring是java界的“胶水”。
    提供了很多非常好用的工具方法,让各种第三方包可以和谐相处。
    AOP还是很好用,各类语言也都有类似的实现。Spring的AOP实现算是Java里面做的比较好的。
    至于IoC...
    我感觉这完全是Java世对构架走火入魔的产物。除非构架确实够复杂,不然大多情况下是完全没必要去做IoC的。很多时候所谓的可复用完全是臆想出来的,凭空把事情搞复杂了。
    不过IoC的滥用也不能归结给spring。Java就喜欢讲构架。在spring出现前,很多人还在用更丑陋的方式实现类似的功能。
    remnet
        29
    remnet  
       2014-06-27 17:17:39 +08:00
    if else for……
    情何以堪
    dallaslu
        30
    dallaslu  
       2014-06-27 18:06:12 +08:00   ❤️ 1
    Spring 是块万用插线板。所有的零件通过 Spring 统一管理,可做到根据需要随时替换。

    你的组件所需要的零件,原本是在类内部自己创建,现在都由 Spring 来装配。组件需要 Spring “注入”所“依赖”的零件,把装配的权利交给外部的 Spring,也就是“依赖注入”,也叫“控制反转”。
    xiaowangge
        31
    xiaowangge  
       2014-06-27 18:21:31 +08:00
    基于 Annotation Spring MVC

    @Controller
    @RequestMapping("/xxxx.json")

    Spring的核心:依赖注入/控制反转
    RisingV
        32
    RisingV  
       2014-06-27 18:52:31 +08:00
    http://martinfowler.com/articles/injection.html
    或许这篇文章会有所帮助
    qq2511296
        33
    qq2511296  
       2014-06-27 19:18:36 +08:00
    先去了解下面向接口编程
    然后再去了解spring 的aop 和ioc 的好处是什么
    和你以前的开发会由什么不同……

    spring也就是个框架 什么东西都能包容
    可以很容易集成很多其他的开源框架
    akfish
        34
    akfish  
       2014-06-27 19:33:59 +08:00
    看了下lz的发帖、回帖记录,来黑的无误,好多人一本正经的上当鸟。。。
    welsmann
        35
    welsmann  
       2014-06-27 19:38:18 +08:00
    lz你太无聊了..
    Linxing
        36
    Linxing  
       2014-06-27 20:21:39 +08:00
    Spring 框架么?这个问题要怎么回答,你当然可以用 Spring 写个留言板,也可以不用,它只是个框架,提高开发效率而已
    moroumo
        37
    moroumo  
       2014-06-27 21:47:14 +08:00
    春天已经过去了,现在是夏天了
    falconeye
        38
    falconeye  
       2014-06-27 23:10:14 +08:00
    Expert One-on-One J2EE Development without EJB
    harryhao
        39
    harryhao  
       2014-06-27 23:37:50 +08:00
    不是说不能用,只是框架这种东西是要你的代码规模大到一定程度才能真正体会到好与坏的。楼主说的略夸张吧,学了十年……
    windyboy
        40
    windyboy  
       2014-06-28 11:27:35 +08:00
    spirng 做的事情很简单,也是所谓依赖注入做的事情。
    spring 帮你把要做的事情搭一个架子,但最后要怎样完成这件事情,在运行的时候才决定
    数据库连接是一个例子,程序需要数据库连接,需要连接管理,需要事务管理
    无论你是用mysql/mssql/oracle,你可以在程序运行的时候才把具体的数据库告诉spring,也就是注入。
    不需要在你的程序中去关注具体是什么数据库,每个数据库要如何获得连接,管理事务等等
    yangkeao
        41
    yangkeao  
       2014-06-28 17:28:02 +08:00
    @WildCat 糟糕01年我三岁。。。。
    WildCat
        42
    WildCat  
       2014-06-28 17:46:24 +08:00 via iPhone
    @yangkeao 小正太你好。
    yangkeao
        43
    yangkeao  
       2014-06-28 18:43:27 +08:00
    @WildCat 已经高二了好伐
    WhatIf
        44
    WhatIf  
       2014-10-14 05:52:42 +08:00 via Android
    Spring是用来黑EJB的
    申明式事务,容器管理生命周期,横切面等等
    为了黑人家,把主流的工具又封装了一遍,弄了很多统一接口
    看不起checked异常,把人家辛辛苦苦设计的异常都隐藏起来,搞成runtime
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2932 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:02 · PVG 21:02 · LAX 05:02 · JFK 08:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.