常用到的spring的声明通知:
前置通知:aop:before
后置通知:aop:after-returning
异常通知:aop:after-throwing
最终通知:aop:after
环绕通知:aop:around
Spring的7个事务传播行为:
PROPAGATION_REQUIRED-支持当前事务,如果当前没有事务,就新建一个事务,这是最常见的选择。
PROPAGATION_SUPPORTS-支持当前事务,如果当前没有事务,就以非事务方式执行.
PROPAGATION_NOT_SUPPORTED-以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_MANDATORY-支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW-新建事务。如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER-以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED-如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_TRQUITRD类似的操作。
五个事务隔离级别:
1.ISOLATION_DEFAULT:默认的隔离级别,使用数据库默认的事务隔离级别,另外4个与JDB的隔离级别相对应。
2.ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种数据级别会产生脏读,不 可重复读和幻象读。
3.ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是肯能出现不可重复读和幻象读。
4.ISOLATION_REPEATABLE_READ:这是事务隔离级别可以防止不可重复读和脏读。但是可能出现幻想读,他除了保证一个数据不能读取另一个事务未提交的数据外,还保证了不可重复读的情况产生。
5.ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被 处理为顺序执行。为了防止脏读,不可重复读,还防止了幻读。
上面的解释其实都有一个拗口。,其中涉及到几个数语:脏读,不可重复读,幻读。
这里解释一下:
脏读:所谓的脏读,其实就是读到了别的事务回滚前的脏数据。
不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没结束时,另外一事务也访问该同一事务。那么,在第一个事务中的两次读数据之间,由于第二次事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了一个事务内,两次读到的数据是不一样的,因此称为不可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。
幻读:是指事务不是独立时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及了表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是在表中插入了一行新数据。那么,以后就会发生操作第一个事务的用户发现表中有没有修改的数据行,就好像发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。 如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。
使用属性文件配置数据源:
使用提供的PropertPlaceholderConfigurer类可以加载属性文件。在Spring配置文件中可以采用${……}的方式引用属性文件中的键值对。读取属性文件配置DataSource的方法:
<!--引入properties文件-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:database.properties</value>
</property>
</bean>
<!--配置DataSource-->
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.name}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--省略SqlSessionFactoryBean配置-->
<!--省略Dao及业务bean配置-->
<!--省略事务管理配置-->
database.properties属性文件如下所示:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms
name=root
password=123456
上面所对应的值必须得与本人电脑上的配置上对应。
使用JNDI数据源:
使用JNDI的方式配置数据源,前提是必须在应用服务器上配置好数据源。我们以Tomacat为例,配置数据源需要把数据库驱动文件放到Tomcat的lib目录下,并修改的conf目录下的context.xml文件。配置数据源代码如下:
<context>
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="12345" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/smbms?
useUnicode=true&characterEncodingutf-8"/>
</context>
标签的name属性指定了数据源的名称,要与Spring配置文件中jndiName值java:comp/env/后的名称保持一致,Spring配置文件内容如下:
<bean id="dataSource" **class="org.springframework.jndi.JndiObjectFactoryBean**">
<!--通过jndiName指定引用的JNDI数据源名称-->
<property name="jndiName">
<value>java:comp/env/jdbc/smbms</value>
</property>
</bean>
<!--省略其他代码-->
注意:需在Web环境下测试使用JNDI获得数据源对象,可将测试代码编写在Servlet中,通过浏览器访问Servlet进行测试。
Spring的自动装配:
使用自动装配修改配置代码:
<!--Dao-->
<bean id="userMapper" class="com.bdqn.dao.impl.UserDaoImpl" autowire="byName"/>
<!--Service层-->
<bean id="userService" class="com.bdqn.service.impl.UserServiceImpl" autowire="byName"/>
通过设置元素的autowire元素指定自动装配,代替了通过 标签显示指定Bean的依赖关系。这就是Spring自动装配的神奇之处,由BeanFactory检查XML配置文件的内容,为bean自动注入依赖关系,大大简化了Bean注入配置。