什么是SpringIOC?为什么要用IOC而不是New来创建实例?
什么是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 (提供运行环境)
什么是SpringIOC?
SpringIOC是Spring框架的一个核心概念。
java程序中的类互相依赖,大量耦合。而SpringIOC(Inversion of Control)就是去创建管理这些依赖,从而尽可能的降低耦合,这些被它创建管理的类被称为bean。它是一个思想,从字面上看它是控制反转,但是直接说反转可能难以理解,我们可以从另一个角度去理解它,比如先理解正再理解反会更容易一些。什么是正,我们平常去new对象就是正面使用,我们使用Spring依赖注入(DI)去获取对象也是正面使用,new的时候是自己去创建依赖然后使用,但是这样我们的代码内部就有了它的实例,这就有了耦合。
spring容器读取了配置元数据之后,通过java反射创建类并注入其依赖类。
1.增加耦合,会访问到内部属性
2.更新的地方比较多,难于维护
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方法
构造方法
注解方法
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
Spring实战 第二版
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