| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Настройка проксирования в Spring aop + cglib |
| Автор: omickron 20.12.2012, 14:16 | ||||
| Имеется веб-сервер на Spring 3.1, использующий аспекты через библиотеку cglib. В config.xml такие строчки:
Т.е. для каждого бина будет создаваться прокси через cglib. Также мне нужно подключить бин для пула соединений с БД, для которого использую com.mchange.v2.c3p0.ComboPooledDataSource.
Проблема в том, что этот класс отмечен как final, а cglib не умеет проксировать final классы. Нужно как-то указать в конфиге, что бин "connectionPool" проксировать не надо. Как это сделать? |
| Автор: MisterCleric 20.12.2012, 15:55 |
| Привет. Убери proxy-target-class="true" Введи интерфейсы для тех бинов, которые необходимо запроксировать. Какой вообще смысл проксировать все бины?.. Ты еще не один раз с толкношся с тем, что CGLIB не может запроксировать тот или оной объект. Например, entityManager, если ты его получешь из контейнера AS, через JNDI |
| Автор: omickron 20.12.2012, 15:58 |
| Проксирую почти все бины - классы собственного написания. Использую для журнализации методов. Нельзя разве spring'у указать, какие бины проксировать, а какие - нет? Интерфейсы - единственное решение? upd. Кстати, если убрать proxy-target-class="true", то @Autowired тоже перестанет работать, т.к. в нём тоже используется cglib. Интерфейсы придётся писать для всех бинов. |
| Автор: MisterCleric 20.12.2012, 16:42 | ||||
Именно.
Ты знаешь: не задумывался. Задай вопрос здесь: http://forum.springsource.org/forumdisplay.php?31-AOP Или пощи уже готовый ответ там |
| Автор: omickron 20.12.2012, 16:48 |
| Понятно... спасиб. Возможно, и придётся настрочить интерфейсы для всех бинов. Но хочется докопаться до истины. |
| Автор: Pawl 20.12.2012, 22:15 |
| Прошу прощения, а разве бин не проксится в качестве аспекта при помощи аннотации @Aspect? Если убрать @Aspect, а оставить, к примеру, @Service, то и бин не будет аспектом и @Autowired будет работать. |
| Автор: omickron 20.12.2012, 22:36 | ||||||
Штука как раз не в @Aspect, а в
Как я понял, когда proxy-target-class="true" Spring пытается создать прокси для всех бинов, которые встречает. Если убрать вообще эту строчку
то ошибки нет. Но и бин, помеченный @Aspect, не работает как аспект. :( |
| Автор: Pawl 20.12.2012, 23:29 | ||||||||||||||||
Работает. Я приведу пример простейшего АОП, разработанный мной для меня в учебных целях. Прилага выводит на экран страничку с кнопкой и числом, которое увеличивается на 1 после нажатия кнопки. Каждое обращение к странице логируется аспектом. Путь к логу задается в property-файле. Для увеличения числа используется сервисный классик - не аспект. Итак: web.xml:
dispatcher-servlet.xml:
log.properties:
index.jsp:
аспект:
контроллер:
счетчик:
page.jsp:
И самое главное - на рисунке набор библиотек, с которым это все работает. Я долго мучился с этими библиотеками! |