一如惯例,先来对Spring的知识点有个整体的认识:
一、Spring简介
1.概念:
Spring是一个开源的用于简化采用Java语言开发企业级程序的一个分层的框架。
2.Spring组成:
Core封装包是框架最基础的部分,提供IoC和依赖注入特性。
AOP提供了面向方面的编程实现,让我们可以方便的定义方法拦截器和切点。
DAO提供了JDBC的抽象和封装,方便我们使用JDBC的方式访问数据库,同时提供了声明式事务管理的功能。
ORM提供了常用的ORMMapping API(JPA, JDO, Hibernate,iBatis.)的集成。我们公司目前采用Spring提供的ibatis集成。
Web提供了针对web层开发的集成特性。
二、Spring的IoC
1.概念:
IoC(Inversion of Control,控制反转):对象的协作关系由对象自己负责。
DI(Dependency Injection,依赖注入):对象的协作关系由容器来建立。
2.IoC的类型(即注入方式)
1)基于特定接口(侵入式方案)
2)基于setter方法
a.注入简单属性(八种基本类型)。
对于基本类型,Spring容器会自动作类型转换,以便赋值。
b.注入集合类型
集合类型有Set,List,Map和Properties。
Set中存放字符串,对象,集合,不允许重复。
List中可以放入字符串,对象,List。
Map有<entry>子元素来存取key,value,key只能为String。
Properties有<props>子元素。
c.属性编辑器
3)基于构造器(constructor)
如果Bean属性不多,并且属性值必须要注入才能使用,则应该采用constructor注入,其他情况就要set方法注入。
自动装配(AutowringProperties)
装配方式:byName,byType,autodetect,constructor
byName:按照名称匹配,按照Bean的Id与属性的名称进行匹配。
自动装配与手动装配可以结合使用,手动装配会覆盖自动装配。
byType:按照类型匹配,要注入的属性类型与配置文件中的Bean类型匹配的个数超过一个,会出错。
antodetect:先按照construct,后按照byType。
constructor:先去匹配构造器中参数类型,后与配置文件中的Bean类型匹配。
3.原理:
IoC使用的原理就是反射。
其实IoC就是将对象映射到配置文件中,从而将其创建延迟到了IoC容器中,这样就对对象的创建实现了封装。
4.好处:
使用IoC的好处有很多,但归根结底也就是反射的好处,我们来看看它都体现在什么方面:
1)大量减少了Factory和Singleton的数量,使代码层次更加清晰,主要原因是我们不再查找,定位和创建和管理对象之间的依赖关系了,都交给了loC容器管理了。
2)Spring的loC容器是一个轻量级的容器,没有侵入性,不需要依赖容器的API,也不需要实现一些特殊接口。
3)一个合理的设计最好尽量避免侵入性
4)会使我们的框架工作的更好
5)提供了AOP声明式服务能力,可以针对POJO对象提供声明式服务能力,如:声明式事务
6)对于资源,如Hibernate Session或JDBC Connection我们不在负责开启和关闭
7)鼓励了我们面向接口编程
8)减少了代码中的耦合(解耦合),将耦合推迟到了配置文件中,发生了编号也更容易控制。
三、Spring的AOP
1.概念:
将程序中的交叉业务逻辑提取出来,称之为切面。将这些切面动态织入到目标对象,然后生成一个代理对象的过程。
2.相关概念:
相关概念有Aspect(切面),Joinpoint(连接点),Advice(通知),Pointcut(切入点),Introduction(引入),Weaving(织入),、Target(目标对象),Proxy(代理对象)等
具体可见:《Spring中的AOP》
3.原理:
AOP使用的原理就是动态代理(说到底也是反射)。
四、Spring对持久层的支持
1.概念:
继承HibernateDaoSupport类,使用HibernateTemplate来持久化。
2.原理:
HibernateTemplate是对HibernateSession的轻量级封装。
3.异常与事务回滚
默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会回滚的。编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理。
关于事务边界的设置,通常设置到业务层,不要添加到Dao上
五、Spring对事务的支持
1.AOP事务的含义
事务当作一个切面,动态地织入到目标对象,形成一个代理对象。
2.事务机制(支持声明式事务)
声明式事务的配置:
配置SessionFactory
配置事务管理器
把SessionFactory注入到transactionManager
事务的传播特性
哪些类哪些方法使用事务
具体的实现可参见后面博客SSH框架搭建中的applicationContext-common.xml中的配置。
3.Spring中事务的使用
1) Spring中使用Hibernate事务(编程式事务)、
openSession和getCurrentSession的区别?
openSession必须关闭,currentSession在事务结束后自动关闭。
openSession没有和当前线程绑定,currentSession和当前线程绑定。
2)全局事务与本地事务
如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">
thread</property>
如果是全局事务(jta事务)
<propertyname="hibernate.current_session_context_class">jta</property>
六、SSH整合
关于该内容在后面博客中会详细解说。