170 похожих чатов

Spring AOP. есть класс, на который натравлен аспект. В классе

объявлено два метода:
public MyClass getThis() {
return this;
}

public List<MyClass> getThat() {
return List.of(this);
}

В отладчике вызываю эти методы. getThis возвращает cglib-enhanced обертку, getThat - лист с оригинальным классом.

1) Это нормально?
2) Есть ли возможность заставить getThat возвращать лист с cglib-enhanced оберткой?

15 ответов

18 просмотров

а где вы вызываете оба метода?

Nikita-Fedkin Автор вопроса
I S
а где вы вызываете оба метода?

в стороннем классе, который получает MyClass как бин. ставлю точку останова и в watches отладчика гляжу. плюс есть тест, который проверяет эту же ситуацию уже кодом

интересный кейс 🙂 такое чувство, что причина в equals и hashCode бинов в контексте. При возврате this - спринг находит в контексте этот бин (предположение! а то налетят сейчас 🙂 ), а вот лист у тебя генерится каждый раз новый, соответственно он его найти в контексте не может и возвращает без прокси.

Dmitriy Zanin
интересный кейс 🙂 такое чувство, что причина в equ...

потому что даже при дебаге, при остановке в методе getThis() - this там не является прокси объектом и как бы возвращает метод НЕ прокси объект. А вот уже на другой стороне, сервис его вызывавший получает почему то прокси

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶
Ну да, так это и работает

ну на самом деле не совсем очевидно. в какой момент НЕ прокси становится прокси?

А вам вообще зачем такой изврат? Это академическая задача или какая-то реальная проблема?

Nikita-Fedkin Автор вопроса
Andrey Belyaev
А вам вообще зачем такой изврат? Это академическая...

делаю подсистему событий на аспектах. мне не нравится, что для публикации событий нужно в прикладные классы инжектить applicationEventPublisher и явно вызывать у него создание эвентов и их публикацию. основная идея - создать аспект, в котором выделить логику перехвата вызовов, требующих генерации событий, и собственно самой генерации событий. чтобы прикладной код отдельно, события отдельно. прототип выглядит вот так: https://i.postimg.cc/cL68Z9tX/image.png так как аспектируемые объекты могут передавать this внутрь других классов, то есть риск вызова метода, на котором в аспекте назначен эдвайс, из объекта, не являющегося aоп-прокси. в конкретной текущей кодовой базе таких вызовов нет, но и подсистема событий со временем будет расширяться. дебажить такое продолбанное событие будет тем еще приключением, поэтому думаю, как защитится от этого изначально

Nikita-Fedkin Автор вопроса
Nikita-Fedkin Автор вопроса
Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶
Да

я ковырял в сторону Load-Time Weaving, но утонул в варнингах в логах. попробую покопать CTW, спасибо за наводку

Nikita Fedkin
делаю подсистему событий на аспектах. мне не нрави...

Вот момент про риск вызова не того метода я не понял. Вы боитесь отдать наружу из аспекта объект-не-прокси, метод которого можно будет вызвать без генерации события? Ну так напишите аспект так, чтобы не отдавать. Добавьте принудительное оборачивание объектов в нужные прокси.

Nikita-Fedkin Автор вопроса
Andrey Belyaev
Вот момент про риск вызова не того метода я не по...

не, речь не про код аспекта. вот есть у меня бин1, который используется где-то вовне. аспект следит за методом на этом бине1. бин1 внутри себя инжектит какой-то другой бин2. внешний объект вызывает эдвайснутый метод на бин1 (он по честному обернут в аоп-прокси), бин2 вызывает эдвайснутый метод на бин1 (а здесь пришел оригинальный this). первый вызов ловится аспектом, второй - нет

Nikita-Fedkin Автор вопроса
Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶
Используйте compile time aspects

спасибо за совет. переход на чистый AspectJ и градль плагин io.freefair.aspectj.post-compile-weaving решили проблему. инстансы бинов совпадают, пропали проблемы с мокитовским spy и вообще все "зеленое"

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта