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