2014-04-01 55 views
0

看下面的两个类和AOP配置,我不确定这是否正确?我已经在PartnerService上配置了一个切入点,但只能在PartnerDao中使用该会话。这会安全地开始一个新的会话(和交易),我可以在PartnerDao中使用吗?Spring&AOP:获得切入点配置权

这些都是我的班

PartnerService.java:

public class PartnerService { 

    private PartnerDao dao; 

    public void setDao(PartnerDao dao) { 
     this.dao = dao; 
    }  

    PartnerDao getDao() { 
     return dao; 
    } 

    public List<Partner> getPartners() { 
     return getDao().getPartners(); 
    } 

    public void createPartner(Partner partner) { 
     getDao().createPartner(partner); 
    } 

} 

PartnerDao.java现在

public class PartnerDao { 

    private HibernateTemplate template; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.template = new HibernateTemplate(sessionFactory); 
    }  

    HibernateTemplate getTemplate() { 
     return template; 
    } 

    public List<Partner> getPartners() { 
     return getTemplate().execute(new HibernateCallback<List<Partner>>() { 

      @Override 
      public List<Partner> doInHibernate(Session s) throws HibernateException { 
       Criteria c = s.createCriteria(Partner.class); 
       return c.list(); 
      }      
     });   
    } 

    public void createPartner(Partner partner) { 
     getTemplate().save(partner); 
    } 

}

,我想使用AOP管理交易。我有以下AOP配置在applicationContext.xml中:

<aop:config>   
    <aop:pointcut id="serviceMethods" expression="within(com.company.pas.service.*)"/> 
    <aop:advisor advice-ref="companyTransactionAdvise" pointcut-ref="serviceMethods"/> 
</aop:config> 

如果你看一下我的AOP的配置,我配置了PartnerService一个切入点(它位于com.company.pas.service) 。但是,我只是在处理PartnerDao中的会话。我实例化这些类的方式是我有一个ServiceFactory,它返回一个带有自动装配的PartnerDao实例的PartnerService。

回答

0

为什么不使用Spring AOP Transactional Management?使用注释将会像使用@Transactional注释您的服务方法一样简单。

+0

这不就是我用的吗?我有一个配置为用于控制事务的AOP配置。我使用XML配置,但我喜欢保持配置和类分开。 – sbrattla

+0

噢,确定,通过'tx'命名空间作为tx:建议来通过事务管理器进行AOP配置并不明确。那么问题是什么呢?只要你从服务的DAO方法中调用DAO方法,这些方法是交易的入口点,因为它仍然处于启动的同一事务中。通常的做法是在内部使用注入的DAO的服务层中添加事务支持。 – dimitrisli

+0

我不明白的是,如果AOP在我输入服务类时启动事务,那么事务管理器如何知道它是通过相关DAO提供的会话(HibernateTemplate),它应该在离开服务类时提交?此外,如果我的服务类使用两个不同的DAO,每个都有自己的会话(HibernateTemplate),那么AOP如何知道这两个会话是相关的并且应该是原子的?在我的服务类中使用“编码的”事务划分很容易实现...但我不明白AOP如何自己弄清楚这一切? – sbrattla