Size: a a a

2021 January 15

NG

Nikita Gryzlov in pro.jvm
Dmitriy Zanin
тоже так сначала подумал, но нет - все равно в листе приходит без прокси.
пардон, не заметил, что уже пробовали
источник

AG

Alexey Genus in pro.jvm
Ага, это не работает для вызовов внутри класса
источник

NG

Nikita Gryzlov in pro.jvm
судя по ответам на SO можно погрузиться в сам AspectJ и перехватывать обращения к филдам. Spring AOP так не умеет, он только вызовы методов перехватывает. но это же прям черная магия :)
источник

AB

Andrey Belyaev in pro.jvm
Nikita Gryzlov
Spring AOP. есть класс, на который натравлен аспект. В классе объявлено два метода:
  public MyClass getThis() {
   return this;
 }

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


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

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

NG

Nikita Gryzlov in pro.jvm
Andrey Belyaev
А вам вообще зачем такой изврат? Это академическая задача или какая-то реальная проблема?
делаю подсистему событий на аспектах. мне не нравится, что для публикации событий нужно в прикладные классы инжектить applicationEventPublisher и явно вызывать у него создание эвентов и их публикацию. основная идея - создать аспект, в котором выделить логику перехвата вызовов, требующих генерации событий, и собственно самой генерации событий. чтобы прикладной код отдельно, события отдельно.

прототип выглядит вот так:
https://i.postimg.cc/cL68Z9tX/image.png

так как аспектируемые объекты могут передавать this внутрь других классов, то есть риск вызова метода, на котором в аспекте назначен эдвайс, из объекта, не являющегося aоп-прокси. в конкретной текущей кодовой базе таких вызовов нет, но и подсистема событий со временем будет расширяться. дебажить такое продолбанное событие будет тем еще приключением, поэтому думаю, как защитится от этого изначально
источник

A

Artjom Kalita in pro.jvm
А какую проблему именно аспекты у вас решать будут ?
источник

NG

Nikita Gryzlov in pro.jvm
Artjom Kalita
А какую проблему именно аспекты у вас решать будут ?
проблему наличия в прикладном коде кода генерации событий :)
источник

A

Artjom Kalita in pro.jvm
Что такое прикладные классы ? :)
источник

NG

Nikita Gryzlov in pro.jvm
сама генерация событий будет вынесена в аспект. в прикладном классе только его прикладная логика
источник

NG

Nikita Gryzlov in pro.jvm
ну... "бизнесовые" которые. в которых полезный код
источник

A

Artjom Kalita in pro.jvm
Но событие это же тоже может быть часть бизнес логики разве нет ?
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
Nikita Gryzlov
делаю подсистему событий на аспектах. мне не нравится, что для публикации событий нужно в прикладные классы инжектить applicationEventPublisher и явно вызывать у него создание эвентов и их публикацию. основная идея - создать аспект, в котором выделить логику перехвата вызовов, требующих генерации событий, и собственно самой генерации событий. чтобы прикладной код отдельно, события отдельно.

прототип выглядит вот так:
https://i.postimg.cc/cL68Z9tX/image.png

так как аспектируемые объекты могут передавать this внутрь других классов, то есть риск вызова метода, на котором в аспекте назначен эдвайс, из объекта, не являющегося aоп-прокси. в конкретной текущей кодовой базе таких вызовов нет, но и подсистема событий со временем будет расширяться. дебажить такое продолбанное событие будет тем еще приключением, поэтому думаю, как защитится от этого изначально
Используйте compile time aspects
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
То есть aspectj
источник

NG

Nikita Gryzlov in pro.jvm
Artjom Kalita
Но событие это же тоже может быть часть бизнес логики разве нет ?
событие - это следствие бизнес-логики. что с этим событием потом будут делать остальные компоненты системы - не ответственность объекта, который вызвал это событие
источник

NG

Nikita Gryzlov in pro.jvm
Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶
Используйте compile time aspects
Compile-Time Weaving имеете ввиду?
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
Nikita Gryzlov
Compile-Time Weaving имеете ввиду?
Да
источник

NG

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

A

Artjom Kalita in pro.jvm
а чем подход инджектить именно в сервисы EventPublisher который и будет дальше уже кидать ивент через спринг не подходит ? (делали так в проекте - было норм - единственное что учитывать нужно это поведение @Transactional)
источник

NG

Nikita Gryzlov in pro.jvm
Artjom Kalita
а чем подход инджектить именно в сервисы EventPublisher который и будет дальше уже кидать ивент через спринг не подходит ? (делали так в проекте - было норм - единственное что учитывать нужно это поведение @Transactional)
конкретно в спринге я с таким подходом еще не работал, но в других языках (ts/php) инжект эвент-паблишера неизменно приводил к сильной мешанине в коде (при наличии большого количества событий), причем у разных команд.
я, видимо, избалован фреймворками, которые скрывают за инфраструктурным слоем код генерации событий от разработчиков, пишущих бизнесовую логику. разрабы не думают где и как вызываются события, они даже не видят этого кода. лишь знают, что есть такие-то эвенты и они могут их обрабатывать.
хочется дать похожие возможности и в своем проекте
источник

D

Dima in pro.jvm
Artjom Kalita
а чем подход инджектить именно в сервисы EventPublisher который и будет дальше уже кидать ивент через спринг не подходит ? (делали так в проекте - было норм - единственное что учитывать нужно это поведение @Transactional)
один консерн
источник