1. Spring是什么?
a) 一个开源框架,
b) Rod Johnson创建
c) 为简J2EE开发而创建
d) 官方网站 http://springframework.org
2. Spring的主要特性
概括来说,Spring是一个轻量级的Ioc和AOP框架
1. 轻量级:大小才1M多(这是其次),非侵入性...用Spring开发的对象一般不依赖于Spring
2. Ioc:反转控制,Spring使用反转控制实现松耦合,Spring在实例化对象的时候主动将它的依赖类注入.
3. AOP:面向切面
3.Spring概述
4. Spring 的基本管理
BeanFactory:管理对象的加载,生成,依赖关系,生命周期
ApplicationContext:除了BanFactory功能外,还有其它一些功能:发布事件,国际化等.
1).依赖关系
Set注入:
构造方法注入
属性引用(Property Reference)
自动绑定: byType:添加default-autowire="byType"建议用这种装配
byName: 添加default-autowire="byName"
2)在Web应用中使用Spring,将DAO对象交由Spring处理创建.
a. web.xml文件加载Spring
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/configs/applicationContext.xml</param-value> </context-param> <!-- Spring Loader --> <listener> <listener-class>org.springframework.web.context.ContextLoaderList ener</listener-class> </listener>
b. 编写并配置Servlet,在启动的时候加载(load-on-startup)
Servlet中覆盖init方法,如下所示:
DAOFactory中增加static的变量类型private static WebApplicationContext ctx;
c. DAOFactory中修改creatXXX..的方法,使用appContext.getBean(“beanName”)来获得bean
5. Spring的主要事务传播行为类型
事务传播行为类型 | 说明 |
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
在使用过程中需要注意点:
1)NESTED和NEW的区别
PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED是容易混淆的两个传播行为。PROPAGATION_REQUIRES_NEW 启动一个新的、和外层事务无关的“内部”事务。该事务拥有自己的独立隔离级别和锁,不依赖于外部事务,独立地提交和回滚。当内部事务开始执行时,外部事务 将被挂起,内务事务结束时,外部事务才继续执行。由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于:PROPAGATION_REQUIRES_NEW 将创建一个全新的事务,它和外层事务没有任何关系,而 PROPAGATION_NESTED 将创建一个依赖于外层事务的子事务,当外层事务提交或回滚时,子事务也会连带提交和回滚。嵌套事务不能够提交,它必须通过外层事务来完成提交的动作,外层事务的回滚也会造成内部事务的回滚。
2) 当方法被设置为PROPAGATION_NOT_SUPPORTED时,外层业务方法的事务会被挂起,当内部方法运行完成后,外层方法的事务重新运行。如果外层方法没有事务,直接运行,不需要做任何其它的事。
3) 当业务方法被设置为PROPAGATION_NEVER时,它将不能被拥有事务的其它业务方法调用。
4) 当业务方法被设置为PROPAGATION_MANDATORY时,它就不能被非事务的业务方法调用。