内容简介:聊一聊项目中的Spring(execution表达式)
[一知半解,就是给自己挖坑],开篇先补充一下事务的相关知识。
编程式事务
所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务
管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。
声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。
一般来说,项目开发中基本使用的都是声明式事务,要不配置XML,要不使用@Transactional注解。
applicationContext.xml:
<context:property-placeholder location="classpath:database.properties" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" >
<property name="DriverClassName" value="${mysql.driverclass}"/>
<property name="Url" value="${mysql.jdbcurl}"/>
<property name="MaxActive" value="${MaxActive}"/>
<property name="MinIdle" value="${MinIdle}"/>
<property name="Filters" value="${Filters}"/>
<property name="TimeBetweenEvictionRunsMillis" value="${TimeBetweenEvictionRunsMillis}"/>
<property name="Username" value="${mysql.user}"/>
<property name="Password" value="${mysql.password}"/>
</bean>
<!-- 升级hibernate4 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 统一导入hbm.xml文件 -->
<property name="mappingLocations">
<list>
<value>classpath:com/acts/web/*/model/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- 1代表 true,0代表false 自动转换 -->
<prop key="hibernate.query.substitutions">true=1,false=0</prop>
<prop key="jdbc.use_scrollable_resultset">false</prop>
<prop key="hibernate.current_session_context_class">
org.springframework.orm.hibernate4.SpringSessionContext
</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="check*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="change*" propagation="REQUIRED" />
<!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到-->
<tx:method name="*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config proxy-target-class="true">
<aop:pointcut id="allServiceMethod" expression="execution(* com.acts.*.*.service..*.*(..))" />
<aop:advisor pointcut-ref="allServiceMethod" advice-ref="txAdvice" />
</aop:config>
好,说了这么多,言归正传说一下配置中的execution。
execution(* com.acts. . .service.. . (..)) 解释如下: 符号 含义 execution() 表达式的主体; 第一个” “符号 表示返回值的类型任意; com.acts. . .service AOP所切的服务的包名,即,我们的业务部分 包名后面的”..“ 表示当前包及子包 第二个” “ 表示类名, 即所有类。此处可以自定义,下文有举例 . (..) 表示任何方法名,括号表示参数,两个点表示任何参数类型
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Data Mining
Bing Liu / Springer / 2011-6-26 / CAD 61.50
Web mining aims to discover useful information and knowledge from Web hyperlinks, page contents, and usage data. Although Web mining uses many conventional data mining techniques, it is not purely an ......一起来看看 《Web Data Mining》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
在线进制转换器
各进制数互转换器