【JAVA修真院小课堂】什么是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.更多讨论

Q:(郭超)Spring容器中的bean是容器启动就存在了吗?其中的bean默认是单例模式还是多例模式?
A:(张强)启动的时候会自动创建bean,其中的bean默认是单例模式,如果使用多例的话需要设置scope为prototype。

Q:(郭超)需要的时候才创建的话懒加载又是什么?
A:(张强)知道这个概念,但是没有尝试过……
设置default-lazy-init=”true”启动懒加载。

Q:(杨聪聪)有试过基于xml的自动装配吗?
A:(张强)没有……(原来基于xml的自动装配就是autowore)
xml的自动装配就是通过autowire配置(原来是直接@Autowired):

Q:(韩亚博)xml和注解 更倾向使用哪种 为什么?
A:(张强)都可以,更倾向于注解方式,因为注解方式比较方便,而且不用配置,直接标注就可以使用

Q:(王耀琪)注解的优点是什么?
A:(张强)便捷,快速,可以通过xml或者直接注解的方式配置。

Q: (杨聪聪)@Autowired 可以标注哪些成员?
A:(张强)可以标注使用扫描注解或者xml里配置的成员。

Q:(方逾阳)构造法和setter方法哪种更好的?有没有这种比较?
A:(张强)构造方法是固定的,加载的时候已经初始化好了的。setter是比构造方法后加载的。根据情况各有针对性。

Q:(常雷雷)SSM框架整合中Spring容器的加载顺序是咋样的?
A:(张强)加载顺序是xml配置,然后静态工厂配置,然后创建bean实例。

Q:(何东霖)ref和value使用上有什么区别?
A:(张强)ref是已经配置的bean,value是简单的基本属性。

Q:(娄文彬,常雷雷)@Autowired与@resouce的区别是什么?
A:(张强)@Autowired是spring的注解,默认为bytype,@resource是j2ee的注解,默认为byname。

Q:(晋良金)@Autowired @Resource分别在什么情况使用
A:(张强)@A是自动搜索通过bytype的顺序匹配,@R是j2ee的,通过name匹配,所以在通过不同形式装配的时候根据需要使用

Q:(晋良金)试过p命名空间吗?
A:(张强)没有试过……
p命名空间:
<bean id="id class="..classn" p:name="name" p:spouse-ref="beanname"/>
<bean id="beanname"/>

p:name,表示的是Class中定义的name属性
p:spouse-ref,表示的Class中的spouse属性,其对应下面的id为beanname的值。

Q:(王耀琪)控制反转与依赖注入的关系
A:(张强)同种情况的不同角度,这两个指的是一个情况。

PPT地址


技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。

快来与我一起学习吧~http://jnshu.com/login/1/23184943

猜你喜欢

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