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

请问 springIOC 在代码里的具体实现

  •  
  •   nulihuxi · 2019-01-24 22:57:57 +08:00 · 2258 次点击
    这是一个创建于 2137 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看了很多关于 springIOC 思想的博客,大多是说应用程序依赖于 IoC 容器,IOC 容器在程序需要的时候注入对象,取代之前需要在代码内 new 对象的情况。 关于 bean 注入 ioc 容器我的理解是:类似于 xml 文件中定义一个个 bean,或者用注解的形式类似 @Service 这种将 bean 注入 ioc 容器。 但是从容器中拿出 bean 我有一些疑惑:在工作中,看别人的代码和大神写的开源软件,除了类似 @autowired 这种形式以外,也要 new 一个个对象,而很少有 getBean 这种形式。 那么请问大家,SpringIOC 思想具体到实际开发中应该是怎样的呢?

    8 条回复    2019-01-25 14:39:38 +08:00
    j2gg0s
        1
    j2gg0s  
       2019-01-25 00:27:07 +08:00
    IoC 是什么?
    Spring IoC 的实现思路?
    IoC 在对 Java 开发的影响?
    把想了解的问题可以稍微拆的小一点 && Google
    shaohan0228
        2
    shaohan0228  
       2019-01-25 10:23:09 +08:00   ❤️ 1
    我觉得 autowired 就已经完成了很多了啊,尤其是业务组件多的时候,一个一个去 new,那不麻烦死了。也不能可能所有都用 Spring 去注入,我创建一个实体类存数据,也用 Spring 那不是太麻烦了。
    我之前看到过别的代码中,整个业务流程基于流的,流的每个节点就是直接通过类似 Spring getBean 去获取的,然后组成一个完整的 Flow 去运行。
    要去理解的话,应该想一下,如果没有 Spring 这一套东西,你的代码应该怎么去组织,去写,如果你去解决的话,又会采取哪种方式。
    话说我的陈年项目中,还是用 XML 呢,注解啥都没用。
    nulihuxi
        3
    nulihuxi  
    OP
       2019-01-25 10:51:44 +08:00   ❤️ 1
    @shaohan0228 我是不是可以理解为在 xml 中定义<bean>以及类似 @Controller、 @Service 等等注解就是向 IOC 容器中注入,当代码中 getBean 或者 @AutoWired 就是从 IOC 容器中取出。因为我没接触过除了 spring 以外的方式开发,所以理解不了没有 spring 这套东西是如何写的....
    chanchan
        4
    chanchan  
       2019-01-25 11:10:10 +08:00
    《架构探险——从零开始写 Java Web 框架》说得蛮清楚的
    shaohan0228
        5
    shaohan0228  
       2019-01-25 11:32:25 +08:00   ❤️ 1
    @nulihuxi 具体 @Controller 后具体的实现,不过之前我们这有过类似的简易写法,指定 package,由一个服务在启动的时候去加载,扫描包下的所有类,构造成一个列,如果需要某个类,就从列中获取,然后由服务单独去反射构造这样。
    skypyb
        6
    skypyb  
       2019-01-25 13:23:44 +08:00   ❤️ 1
    没有 IOC 那你不只能 new 了,Service 啊之类的还得写个 Singleton。怪麻烦的。
    IOC 优势在于将对象交给 Spring 管理,将调用者和对象本身进行一个极致的解耦。而解耦在程序设计中是极为重要的。
    liukanshan
        7
    liukanshan  
       2019-01-25 14:15:37 +08:00   ❤️ 1
    你的问题是不是用了 IOC 整个项目不应该再出现 new 关键字是吗 ? 用了 SpringIOC 不代表不能使用 new 关键字创建对象,getBean 的方式适合有 Spring Context 的情况下,如果存在很多的 POJO 对象 没有必要都给 Spring 管理 如果硬要这样做 也没有问题 只不过没有必要 你需要修改 Scope 为 prototype 因为 IOC 默认都是单例模式 ,而在一些场景下获取 Spring Context 不太方便 。
    nulihuxi
        8
    nulihuxi  
    OP
       2019-01-25 14:39:38 +08:00
    @liukanshan 懂了感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2705 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 09:02 · PVG 17:02 · LAX 01:02 · JFK 04:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.