Java绿地(~ming~)

Java 草地

常用链接

统计

最新评论

Spring的AOP和事物管理

AOP(面向切面)技术: Aspect-Oriented Programming,是对OOP的一种补充。

    1AOPOOP的主要区别、:OOP针对实体及其属性和行为进行抽象封装

       AOP针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,比如权限检查,日志写入,事务管理,并不需要对OOP采取嵌入式代码,而是采取在将通知在切点织入的方式。 还是通过容器注入进行管理。

    2 AOP常用术语:a.切面(Aspect):是你要实现的交叉功能,是一种描述性的思想。

       b.连接点(Joinpoint):应用程序执行过程中插入切面的地点(如方法调用,异常抛出),但连接点不一定要插入切面。

       c.通知(Advice):切面的实际实现,是一种逻辑代码。

       d.切入点(Pointcut):定义了通知应用在哪些连接点。e.目标对象(Target):被通知对象

       e.代理(Proxy):将通知应用到目标对象后创建的对象。

       f.织入:(Weaving:将切面应用到目标对象从而创建一个新的代理对象的过程。








备注:代理模式的优势:授权机制:不同级别的用户对同一对象拥有不同的访问权利

     某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动,可节省内存开销

     客户端只与接口交互,通过代理模式可以get不同的业务对象。

 

七:面向切面编程的应用:事务管理(Spring分程序控制和声明式)

   1.描述事务的缩写词(ACID

      a.(Atomic):原子性:事务由一个或多个行为绑在一起组成,好像是一个单独工作单元。

        原子性确保在事务中的所有操作要么都发生,要么都不发生。

  b.(Consistent):一致性:一旦一个事物结束了(不管成功与否),系统所处的状态和它的业务规则是一致的。

  c.(Isolated):隔离性:事务应该允许多个用户操作同一个数据,一个用户的操作不会和其他用户的操作相混淆。

  d.(Durable):一旦事务完成,事务的结果应该持久化。

  2.事务属性:是对事务策略如何应用到方法的描述。

     a.传播行为(Propagation):定义了客户端和被调用方法的事务边界,和ejb中传播规则相同,只是加了前缀PROPAGATION,如:PROPAGATION_REQUIRED

     b.隔离级别(Isolation)一般采用数据库默认行为即可,在理想状态下,事物要完全相互隔离,然而完全隔离会影响性能,有时需要在事务隔离上有些弹性。

     c.只读(readOnly):如果一个事务只对数据库执行读操作,数据库就可能利用事务只读的特性,使用某些优化措施。

 d.事务超时(timeOut):只对具有启动新事务的传播行为的方法的事务设置超时才有意义,即:required,required_new,nested.

 

 

 

3.声明式事务

a.model:public class User {private Integer id;  private String name;

          private Integer age;          //getter/setter;  }

    b.Dao: public interface UserDao {     public Integer addUser(User user);

           public User getUser(Integer userId);     public List getUsers();  }

    c.DaoImpl: public class UserDaoHibernate extends HibernateDaoSupport implements UserDao { public Integer addUser(User user) {

               return (Integer) getHibernateTemplate().save(user);   }

            public User getUser(Integer userId) {       

               return (User) getHibernateTemplate().load(User.class, userId);    }

            public List getUsers() { String hql="from User";

               return getHibernateTemplate().find(hql);  }  }

d.service: public interface UserManager {  public   Integer addUser(User user);}

e.serviceImpl: public class UserManagerImpl implements UserManager {

       private UserDao userDao;

       public Integer addUser(User user) {Integer userId=userDao.addUser(user);

        return userId;  }  //对数据库的操作根本不用代码嵌入式transaction

      public void setUserDao(UserDao userDao) {    this.userDao = userDao; } }

  

 f.hbm.xml: <hibernate-mapping package="mypack"><class name="User" table="user">

<id name="id" column="id" type="integer"><generator class="identity"/>   </id>

        <property name="name" column="name" type="string"></property> 

        <property name="age" column="age" type="integer"></property> </class>

</hibernate-mapping>

    g.applicationContext.xml: <bean id="userDao" class="mypack.UserDaoHibernate">

      <property name="sessionFactory" ref="sessionFactory" />  //supportDao注入

       

      <bean id="userManagerTarget" class="mypack.UserManagerImpl">

        <property name="userDao" ref="userDao"></property>      </bean>

  

     <bean id="transactionManager"  //真正的事务管理实体对象

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

     <property name="sessionFactory" ref="sessionFactory"/>   </bean>

  

   <bean id="userManager"//通过代理模式参照一个方法的事务属性决定如何执行事务策略。

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

     <property name="transactionManager" ref="transactionManager"></property>//通知

     <property name="target" ref="userManagerTarget"></property>  //目标

     <property name="transactionAttributes">

      <props>    <prop key="add*">PROPAGATION_REQUIRED</prop>  //切点

       <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  </props>

     </property>   </bean>

  h.测试:public void testTransaction(){User user=new User();user.setName("liming");

          user.setAge(22);      Integer userId=userMgr.addUser(user);   }






4
.用元数据声明事务:

   a.service接口加上@ Transactional声明,当然也可以加在serviceImpl实现类上

@Transactional(propagation=Propagation.REQUIRES_NEW),此处表示声明该类所有方法

public interface UserManager {  public Integer addUser(User user);}

//也可对具体方法声明

   b.applicationContext.xml变成如下形式:使支持对元数据的支持

<bean id="userManager" class="mypack.UserManagerImpl">

      <property name="userDao" ref="userDao"></property>  </bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

     <property name="sessionFactory" ref="sessionFactory"></property>

   </bean>

   <bean

class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator>

   </bean>

   <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">

     <property name="transactionManager" ref="transactionManager"></property>

     <property name="transactionAttributeSource">

       <bean class="org.springframework.transaction.annotation.

AnnotationTransactionAttributeSource"></bean> </property>   </bean>

    <bean class="org.springframework.transaction.interceptor.

TransactionAttributeSourceAdvisor">  <property name="transactionInterceptor" ref="transactionInterceptor"></property>   </bean>

posted on 2007-08-19 14:42 mrklmxy 阅读(1531) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: