【修真院java小课堂】什么是SpringIOC?为什么要使用SpringIOC而不是NEW创建实例

  什么是SpringIOC?为什么要用IOC而不是New来创建实例?


1.背景介绍

什么是spring:

 2002年,Rod Johnson在《Expert One-on-One J2EE Design and Development》书中首次推出了Spring框架雏形interface21框架。到现在将近20年了。最早Spring是为了解决企业级应用开发的复杂性而创建的。但是归根究底它的主要使命就是一点:简化java开发

    Spring的开发策略:
    基于POJO类的轻量级和最小侵入性编程;
    通过依赖注入和面向接口实现松耦合;
    基于切面和惯例进行声明式编程;
    通过切面和模板减少样板式代码;

    ◆目的:解决应用开发的复杂性
    ◆功能:使用基本的JavaBean代替EJB,并提供了非常多的功能模块支持
    ◆范围:任何Java应用

    java程序是通过很多类相互协作、相互调用来实现的,也就是说它们相互依赖。只要有了依赖就有了耦合,spring就是为了解决这些耦合,它致力于建造更容易维护、清晰度更高、更容易开发的代码。

   

    Spring的优点:

    低侵入式设计;

    独立性强,能独立于各种应用服务器
    兼容性强,能融合各种框架模块,比如hibernate/mybatis/redis/actuvemq/sgiro/quartz/kafka……

    分层结构,模块化,可扩展性更好
    开发效率高,易维护,易测试
    等等等等

    Spring主要的核心:
    SpringIOC 控制反转 容器管理
    SpringAOP 切面编程
    Spring ORM 对象关系映射
    DAO 数据访问对象 (Transaction JDBC等等)
    Spring Web MVC (web应用)
    Spring Context (提供运行环境)


2.知识剖析

     什么是SpringIOC?
    SpringIOC是Spring框架的一个核心概念。
    java程序中的类互相依赖,大量耦合。而SpringIOC(Inversion of Control)就是去创建管理这些依赖,从而尽可能的降低耦合,这些被它创建管理的类被称为bean。它是一个思想,从字面上看它是控制反转,但是直接说反转可能难以理解,我们可以从另一个角度去理解它,比如先理解正再理解反会更容易一些。什么是正,我们平常去new对象就是正面使用,我们使用Spring依赖注入(DI)去获取对象也是正面使用,new的时候是自己去创建依赖然后使用,但是这样我们的代码内部就有了它的实例,这就有了耦合。


    spring容器读取了配置元数据之后,通过java反射创建类并注入其依赖类。

    


    为什么不使用new来创建实例?

    1.增加耦合,会访问到内部属性

    2.更新的地方比较多,难于维护


    3.常见问题


    SpringBean和javaBean
    传统的javaBean基本上跟POJO类差不多,就是为了传值而存在,没有任何容器去管理它的生命周期,完全是靠回收机制回收。Spring沿用了Bean这个名称,但是Spring里只要是SpringIOC创建管理的任何类都可以称为Bean,而且它生成的bean完全由自己管理,生命周期可以自己控制;


    Ref和Value
    ref: 由IOC管理的其它bean
    value:基本类型赋值


    注解和扫描方式
    context:component-scan   base-package="com.xks.service"     不需要写bean,直接扫描
    context:annotation-config  开启注解,需要写bean


    4.编码实战
    set方法  
    构造方法  
    注解方法  



    5.扩展思考

    beanan生命周期
scope控制bean的生命周期,scope的取值有5种取值:
在Spring 2.0之前,有singleton和prototype两种;
在Spring 2.0之后增加另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用。
singleton 默认 单一实例 所有引用这个bean使用的都是一个,由spring控制。只要不销毁或者推出它就一直存在。
prototype 标准 每次引用spring都返回一个新的,这个对象完全属于引用者。一般用来定义不能共享使用的对象类型。

    Spring的缺点
    1.性能损耗,跟jsp+servlet+javabean性能差距很大
    2.内存消耗大,缓存多
    3.异常(bug)定位不是特别准确
    4.越来越大,不容易理解知识体系(比如spring自己的测试体系,版本变更不清楚,配置和注解背后的原理、和j2EE自己的注解分不清,还有事务管理优越在哪里等等)


    有没有更好的方式代替spring
    因为spring已经被大家研究的比较透彻了,所以一般来说spring是最佳的选择,如果非要替代的话可以直接使用servlet + javaBean 或者 EJB 
        


    6.参考文献

    Spring实战 第二版
        
        

    7.更多讨论

        
    Spring容器中的bean是容器启动就存在了吗?其中的bean默认是单例模式还是多例模式?
启动的时候会自动创建bean,其中的bean默认是单例模式,如果使用多例的话需要设置scope为prototype
 需要的时候才创建的话懒加载又是什么
设置default-lazy-init="true"启动懒加载

注解的优点是什么?

便捷,快速

 @Autowired 可以标注哪些成员?

可以标注使用扫描注解或者xml里配置的成员。

构造法和setter方法哪种更好的?有没有这种比较?

构造方法是固定的,加载的时候已经初始化好了的。setter是比构造方法后加载的。根据情况各有好坏

SSM框架整合中Spring容器的加载顺序是咋样的?

加载顺序是xml配置,然后静态工厂配置,然后创建bean实例

ref和value使用上有什么区别?

ref是已经配置的bean,value是简单的基本属性

@Autowired与@resouce的区别是什么?

@Autowired是spring的注解,默认为bytype

@resource是j2ee的注解,默认为byname



       PPT



猜你喜欢

转载自blog.csdn.net/weixin_42139757/article/details/80312773