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。
這不就是我用的嗎?我有一個配置爲 用於控制事務的AOP配置。我使用XML配置,但我喜歡保持配置和類分開。 –
sbrattla
噢,確定,通過'tx'命名空間作爲tx:建議來通過事務管理器進行AOP配置並不明確。那麼問題是什麼呢?只要你從服務的DAO方法中調用DAO方法,這些方法是交易的入口點,因爲它仍然處於啓動的同一事務中。通常的做法是在內部使用注入的DAO的服務層中添加事務支持。 – dimitrisli
我不明白的是,如果AOP在我輸入服務類時啓動事務,那麼事務管理器如何知道它是通過相關DAO提供的會話(HibernateTemplate),它應該在離開服務類時提交?此外,如果我的服務類使用兩個不同的DAO,每個都有自己的會話(HibernateTemplate),那麼AOP如何知道這兩個會話是相關的並且應該是原子的?在我的服務類中使用「編碼的」事務劃分很容易實現...但我不明白AOP如何自己弄清楚這一切? – sbrattla