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

分享人:张强

1.背景介绍

2.知识剖析

3.常见问题

4.编码实战

5.扩展思考

6.参考文献

7.更多讨论

1.背景介绍

Spring之父 Rod Johnson

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来创建实例?

3.常见问题

SpringBean和javaBean

ref和value

注解扫描方式

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.扩展思考

bean生命周期

Spring的缺点

有没有更好的方式代替spring

bean生命周期

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.参考文献

www.baidu.com

www.google.com

7.更多讨论

分享到此结束

欢迎大家讨论