Я определил следующий перехватчик:
@Aspect
public class OpenSessionInRequestInterceptor {
private Log log = LogFactory.getLog(getClass());
@Autowired
private SessionFactory sessionFactory;
public OpenSessionInRequestInterceptor() {
}
@Around("@annotation(com.sc2.master.aop.hibernate.OpenSession)")
public Object processAround(ProceedingJoinPoint pjp) throws Throwable {
log.info("Opening Hibernate Session in method "+pjp.getSignature());
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
Object ret = pjp.proceed();
session.close();
TransactionSynchronizationManager.unbindResource(sessionFactory);
log.info("Closing Hibernate Session in method "+pjp.getSignature());
return ret;
}
}
Когда я выполняю следующий фрагмент кода в весеннем тесте
@OpenSession
public void call() {
BusinessCustomer customer = (BusinessCustomer) this.customerDao.loadAll().get(0);
System.out.println(customer.getContacts().size());
}
вызывается метод аспекта. Чтобы начать тест, мой тестовый класс выглядит следующим образом:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:WebContent/WEB-INF/applicationContext.xml"})
@Transactional
Однако, когда у меня есть метод, аннотированный @OpenSession, и я развертываю приложение на своем сервере Tomcat, метод перехватчика не вызывается.
Определение контекста приложения выглядит следующим образом:
<aop:aspectj-autoproxy proxy-target-class="true">
</aop:aspectj-autoproxy>
<bean id="openSessionInRequestInterceptor" class="OpenSessionInRequestInterceptor"></bean>
Я совершенно не могу понять, почему АОП не работает при развертывании на коте. Надеюсь, у вас есть идеи.
Решение Я нашел решение. Я помещаю свою конфигурацию aop в applicationContext.xml, но это не сработает. Я поместил конфигурацию в application-servlet.xml, и теперь все в порядке. Кто-нибудь знает, почему?