2010-11-18 3 views
3

Я хочу перехватить метод из непроксированного объекта.spring and aspectj, метод перехвата объекта без прокси

У меня есть экземпляр класса MyClass myClassInstance=new MyClass(), и я хочу перехватить вызов myClassInstance методов.

Я знаю, что все работает хорошо с прокси, но мне нужен аспект на не прокси.

Возможно ли это?

Спасибо.

ответ

5

Возможно, но это нежелательно.

Вы можете использовать @Configurable, а AspectJ перехватит вызовы. Прочитайте the 7.8.1 Using AspectJ to dependency inject domain objects with Spring section of the docs об этом.

Вкратце - AspectJ подключает некоторую «магию» либо время компиляции, либо время загрузки (с соответствующим ткачом), которое модифицирует классы, чтобы они стали частью весеннего контекста.

Из-за того, почему я думаю, что это нежелательно - это темная магия, которая происходит путем изменения структуры классов. Это не объектно-ориентированный подход, и я думаю, что его будет сложно поддерживать. Представьте себе, 6 месяцев спустя ваш коллега отлаживает неприятную проблему. Может потребоваться несколько дней, прежде чем он поймет, что эта магия происходит. Однако это мнение является подчинением. Функциональность есть, и если вам это нужно - используйте ее.

+0

@Bozho: Я аннотирования MyClass с @Configurable, но ничего не перехватывается. – blow

+0

@ blow вам нужно добавить еще одну конфигурацию. Как - как я уже сказал, прочитайте раздел в документах. Насколько я помню, вам понадобится либо компилятор aspectj, либо агент aspectJ JVM – Bozho

+0

@Bozho: ok Теперь я читаю ваши изменения, поэтому я думаю, что это не решение для меня. Мне нужен перехват вызова метода моих сущностей, чтобы управлять сеансом для загрузки ленивых коллекций. Я думаю, это неправильное решение. – blow

1

Использование Spring, я так не считаю (I appear to be wrong), используя AspectJ. Я считаю, что вы можете до тех пор, как вы compile all the code with the AspectJ compiler. Однако я никогда не пробовал.

+0

Я использовал Spring 3.0 вместе с функцией созревания времени aspectJ, и он работал хорошо. Гораздо лучше, чем прокси-подход. – Ralph

0

Вы можете включить временное плетение нагрузки весной. Затем загрузчик классов будет переплетать все аспекты, которые вы определяете, в свои классы при загрузке - независимо от того, создается ли они весной.

Вам необходимо включить LTW, добавив следующую строку в файл контекста:

См: http://static.springsource.org/spring/docs/3.0.0.M4/spring-framework-reference/html/ch07s08.html#aop-aj-ltw

Смежные вопросы