专栏首页IT笔记聊一聊项目中的Spring(execution表达式)

聊一聊项目中的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所切的服务的包名,即,我们的业务部分 包名后面的”..“ 表示当前包及子包 第二个”“ 表示类名,即所有类。此处可以自定义,下文有举例 .*(..) 表示任何方法名,括号表示参数,两个点表示任何参数类型

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring3+Hibernate3升级为Spring4+Hibernate4

    写在开始 今天,把当前项目做了一下升级,特此记录一下。 由于历史原因,项目本身并不是Maven项目,所以升级JAR包都是手动从Maven库中下载,然后load进...

    小柒2012
  • springMvc4+hibernate4的一个奇葩的网上众说纷纭的错误

    springMvc4+hibernate4项目运行报错如下: org.hibernate.HibernateException: Could not obtai...

    小柒2012
  • Shiro如何去掉小尾巴 JSESSIONID

    使用shiro过程中,有时url会遇到JSESSIONID这个小尾巴,感觉好刺眼的样子。 其实shiro在1.3.2版本已经解决了这个问题,只需配置一下参数即可...

    小柒2012
  • php面向对象第二篇

    上次我们讲到构造析构函数是吧。 我们接着来: 构造函数什么时候产生:创建对象的过程中产生的哈 当new people();的过程中的调用构造函数然后才能算...

    用户7873631
  • OpenAuth.Net.landv分支之旅开始制作CRM系统

    landv
  • 数据库中间件分片算法之date

    今天看了一个视频是关于梅西和C罗的,视频的主题是问他们两个是不是朋友?结果可想而知,两个人私底下很较劲,梅西投票从来没投给过C罗,C罗也从来没投过梅西,2个人在...

    BuddyYuan
  • 网页|利用touch实现下拉刷新

    下拉刷新在常见的手机app上大多都有运用。下拉刷新即向下拉重新加载、刷新。下拉刷新在下拉到松手的过程中,经历了三个状态分别是:当前手势滑动位置与初始位置差值大于...

    算法与编程之美
  • android如何设置Activity背景色为透明色

    一直听说透明效果的activity,到底长啥样呢?来张图看看,上面这个白色背景的就是

    砸漏
  • 2.2.3、Google Analytics高级应用——网站停留时间的计算规则与优化

    在使用一段时间GA,如果您足够细心,您会发现,GA有些页面会来源有用户访问,但是时间是0,如图2-25所示,比如平均会话时长,页面平均时长这些字段都有是0:

    GA小站
  • Shiro——基于java的安全框架

    Shiro 把 Shiro 开发团队称为“应用程序的四大基石”——身份验证,授权,会话管理和加密作为其目标。

    时间静止不是简史

扫码关注云+社区

领取腾讯云代金券