分享人:张强
width="640" height="498" src="https://v.qq.com/iframe/player.html?vid=u0653v2cxit&tiny=0&auto=0" allowfullscreen="">1.背景介绍
什么是spring:
2002年,Rod Johnson在《Expert One-on-One J2EE Design and Development》书中首次推出了Spring框架雏形interface21框架。到现在将近20年了。最早Spring是为了解决企业级应用开发的复杂性而创建的。但是归根究底它的主要使命就是一点:简化java开发
Spring的开发策略:
目的:解决应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了非常多的功能模块支持
范围:任何Java应用
java程序是通过很多类相互协作、相互调用来实现的,也就是说它们相互依赖。只要有了依赖就有了耦合,spring就是为了解决这些耦合,它致力于建造更容易维护、清晰度更高、更容易开发的代码。
Spring的优点:
Spring主要的核心:
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.扩展思考
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命名空间:
p:name,表示的是Class中定义的name属性
p:spouse-ref,表示的Class中的spouse属性,其对应下面的id为beanname的值。
Q:(王耀琪)控制反转与依赖注入的关系
A:(张强)同种情况的不同角度,这两个指的是一个情况。
PPT地址