0
아래의 두 클래스와 AOP 설정을 살펴보면, 이것이 맞는지 확실하지 않습니다. PartnerService에서 pointcut을 구성했지만 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 트랜잭션을 관리합니다. 나는 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 구성을 보면
, 나는 (com.company.pas.service에 위치)에 PartnerService의 포인트 컷을 구성하고있어 . 그러나 저는 PartnerDao의 세션 만 다루고 있습니다. 이 클래스를 인스턴스화하는 방법은 PartnerDao의 자동 인스턴스로 PartnerService를 반환하는 ServiceFactory가 있다는 것입니다.
내가 이미 사용하고있는 것이 아닌가요? 나는 구성된 트랜잭션을 제어하는 AOP 구성을 가지고있다. 구성과 클래스를 분리하지 않고 XML 구성을 사용하고 있습니다. –
sbrattla
오케이, 분명히 'tx'네임 스페이스를 통해 AOP 설정을 tx : advice로 사용하여 트랜잭션 관리자를 통과하는 것은 확실하지 않았습니다. 그렇다면 문제는 무엇입니까? 서비스의 진입 점인 DAO 메소드를 호출하는 한, 동일한 트랜잭션이 시작된 이후부터는 좋은 상태입니다. 일반적으로 삽입 된 DAO를 내부적으로 사용하는 서비스 계층에 트랜잭션 지원을 추가하는 것이 일반적입니다. – dimitrisli
내가 얻지 못하는 것은 AOP가 서비스 클래스에 들어갈 때 트랜잭션을 시작하면 트랜잭션 관리자는 관련 DAO를 통해 사용 가능한 세션 (HibernateTemplate)이 서비스 클래스를 벗어날 때 커밋해야한다는 것을 어떻게 알 수 있는가? ? 또한, 내 서비스 클래스가 각각의 세션 (HibernateTemplate)을 가진 두 개의 다른 DAO를 사용한다면 AOP는이 두 세션이 관련되어 있고 원자 적이어야 함을 어떻게 알 수 있습니까? 이것은 내 서비스 클래스에서 "코드화 된"트랜잭션 경계 설정을 사용하여 달성하기가 매우 쉽습니다 ... 그러나 AOP가이 모든 것을 어떻게 알아낼 수는 없습니까? – sbrattla