2014-04-01 143 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