【问题标题】:Spring & AOP : getting pointcut configuration rightSpring & AOP:正确配置切入点
【发布时间】:2014-04-01 07:19:50
【问题描述】:

看下面两个类和AOP配置,我不确定这是否正确?我在 PartnerService 上配置了一个切入点,但只使用 PartnerDao 中的会话。这会安全地开始我可以在 PartnerDao 中使用的新会话(和事务)吗?

这是我的课

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 来管理事务。我在 applicationContext.xml 中有以下 AOP 配置:

<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。

【问题讨论】:

    标签: spring session transactions aop


    【解决方案1】:

    为什么不使用Spring AOP Transactional Management?使用注解就像使用 @Transactional 对 Service 方法进行注解一样简单。

    【讨论】:

    • 这不是我已经在使用的吗?我有一个 AOP 配置,配置的 使用它来控制事务。我正在使用 XML 配置,因为我喜欢将配置和类分开。
    • 哦,好吧,不清楚您是否通过 'tx' 命名空间作为 tx:advice 进行 AOP 配置以通过事务管理器。那么有什么问题呢?只要您从作为事务入口点的服务中调用 DAO 方法,您就很好,因为仍然在同一个事务中启动。在内部使用注入的 DAO 的服务层中添加事务支持是一种常见的做法。
    • 我不太明白的是,如果AOP在我进入服务类时启动事务,事务管理器怎么知道它是通过相关DAO可用的会话(HibernateTemplate)它应该当我离开服务课时提交?此外,如果我的服务类使用两个不同的 DAO,每个都有自己的会话(HibernateTemplate),AOP 怎么知道这两个会话是相关的并且应该是原子的?这很容易在我的服务类中使用“编码”事务划分来实现……但我不明白 AOP 如何自己解决所有这些问题?
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多