Size: a a a

2021 January 15

DZ

Dmitriy Zanin 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 оберткой?
интересный кейс 🙂
такое чувство, что причина в equals и hashCode бинов в контексте.
При возврате this - спринг находит в контексте этот бин (предположение! а то налетят сейчас 🙂 ), а вот лист у тебя генерится каждый раз новый, соответственно он его найти в контексте не может и возвращает без прокси.
источник

AG

Alexey Genus in pro.jvm
Да нет, просто this - это и есть объект без обёртки, так что он кладётся в лист без проксирования. Можно пофиксить через
return List.of(getThis());
источник

АД

Алексей Добрынин... in pro.jvm
Сергей Нелюбин
TeamCity держит скрипт пайплайна в .teamcity
Но по дефолту создает pom.xml
В мавене с таким именем директории модуля проблем нет
А у меня проект gradle и хочется чтоб скрипты пайпа JIdea распарсила корректно, зависимости подтянула и тд
Привет!
Можно нажать правой кнопкой на .teamcity/pom.xml и выбрать “Add as Maven Project”
источник

DZ

Dmitriy Zanin in pro.jvm
Alexey Genus
Да нет, просто this - это и есть объект без обёртки, так что он кладётся в лист без проксирования. Можно пофиксить через
return List.of(getThis());
тоже так сначала подумал, но нет - все равно в листе приходит без прокси.
источник

DZ

Dmitriy Zanin in pro.jvm
Dmitriy Zanin
интересный кейс 🙂
такое чувство, что причина в equals и hashCode бинов в контексте.
При возврате this - спринг находит в контексте этот бин (предположение! а то налетят сейчас 🙂 ), а вот лист у тебя генерится каждый раз новый, соответственно он его найти в контексте не может и возвращает без прокси.
потому что даже при дебаге, при остановке в методе getThis() - this там не является прокси объектом и как бы возвращает метод НЕ прокси объект. А вот уже на другой стороне, сервис его вызывавший получает почему то прокси
источник

AG

Alexey Genus in pro.jvm
А, да, всё правильно, не будет так работать, ошибся я. Тогда только инжектировать самого в себя
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
Dmitriy Zanin
потому что даже при дебаге, при остановке в методе getThis() - this там не является прокси объектом и как бы возвращает метод НЕ прокси объект. А вот уже на другой стороне, сервис его вызывавший получает почему то прокси
Ну да, так это и работает
источник

СН

Сергей Нелюбин... in pro.jvm
Алексей Добрынин
Привет!
Можно нажать правой кнопкой на .teamcity/pom.xml и выбрать “Add as Maven Project”
можно, но после реимпорта градл проекта все слетит и придется снова добавлять модуль вручную - не айс
источник

DZ

Dmitriy Zanin in pro.jvm
Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶
Ну да, так это и работает
ну на самом деле не совсем очевидно.
в какой момент НЕ прокси становится прокси?
источник

АД

Алексей Добрынин... in pro.jvm
Сергей Нелюбин
можно, но после реимпорта градл проекта все слетит и придется снова добавлять модуль вручную - не айс
А можно чуть подробнее, как реимпортится gradle проект?
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
Чтобы получить прокси во втором методе нужно заинжектить ваш бин в себя же и вызывать его
источник

DZ

Dmitriy Zanin in pro.jvm
Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶
Чтобы получить прокси во втором методе нужно заинжектить ваш бин в себя же и вызывать его
это то понятно, вопрос к первому методу, без листа - почему там возвращается прокси?
источник

СН

Сергей Нелюбин... in pro.jvm
Алексей Добрынин
А можно чуть подробнее, как реимпортится gradle проект?
хотя да, действительно - после реимпорта мавен тоже остается
источник

СН

Сергей Нелюбин... in pro.jvm
но при первичном импорте проекта после чекаута из гита придется выполнять это действие
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
Dmitriy Zanin
это то понятно, вопрос к первому методу, без листа - почему там возвращается прокси?
Потому что возвращается не прокси, которая превращается в прокси уже позже
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
А во втором случае думаю в итоге возвращается прокси над листом
источник

АД

Алексей Добрынин... in pro.jvm
Сергей Нелюбин
но при первичном импорте проекта после чекаута из гита придется выполнять это действие
Да, если .idea не коммитить в гит.
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
С телефона сложно это все объяснить, конечно :)
источник

DZ

Dmitriy Zanin in pro.jvm
Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶
Потому что возвращается не прокси, которая превращается в прокси уже позже
сам факт "магии" то понятен 🙂
очень хотелось бы понять "почему", так как в момент вовзрата в самом методе this не является прокси объектом, естественно.
источник

D𝔇

Dmitry 𝔇𝔪𝔦𝔱𝔯𝔶... in pro.jvm
В общем, если кратко - спринг создаёт прокси над вашим классом, в этом прокси ваши методы обернуты в аспект(который видимо создаёт прокси над возвращаемым из метода объектом). Если метод вызывается на бине, то вся эта цепочка отрабатывает, если метод вызывается напрямую, то аспекты не отрабатывают
источник