Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / self injection Spring? / 7 сообщений из 7, страница 1 из 1
18.08.2021, 10:26
    #40091410
springy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
self injection Spring?
Подскажите, пдиз. Что-то не могу понять что это и зачем.

Есть же вроде конструкции объявления бинов типа:

Код: java
1.
2.
3.
4.
@Bean
public SomeClass someClass() {
  return new SomeClass();
}




Из устных объяснений я так понял, что self injection существует как раз для того, что бы объявлять бины.
Похоже я что-то не так понял или не до конца проникся.
Поиском по форуму найти не удалось. Киньте какую-нибудь ссылку с подробностями.
...
Рейтинг: 0 / 0
18.08.2021, 12:15
    #40091443
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
self injection Spring?
springy
Из устных объяснений я так понял, что self injection существует как раз для того, что бы объявлять бины.

по-моему тут какая-то путаница с терминами, self injection в спринге, это когда

Код: java
1.
2.
3.
4.
5.
@Service
public class UserService implements Service{
    @Autowired
    private Service self;
}


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

Код: java
1.
2.
3.
4.
5.
6.
7.
@Bean
public SomeClass someClass() {
  if (dayOfWeek == Sunday)
       return new SomeClassForWeekend();
  else 
       return new SomeClassForWeek();
}



сразу говорю - пример от балды, а то щас знатоки спринга заклюют - скажут, что в версии 6.0.1.SNAPSHOT такое можно стандартными средствами сделать

так в чем ваш вопрос?
...
Рейтинг: 0 / 0
18.08.2021, 12:39
    #40091453
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
self injection Spring?
springy
Подскажите, пдиз. Что-то не могу понять что это и зачем.

Есть же вроде конструкции объявления бинов типа:

Код: java
1.
2.
3.
4.
@Bean
public SomeClass someClass() {
  return new SomeClass();
}




Из устных объяснений я так понял, что self injection существует как раз для того, что бы объявлять бины.
Похоже я что-то не так понял или не до конца проникся.
Поиском по форуму найти не удалось. Киньте какую-нибудь ссылку с подробностями.

то что ты показываешь это один из типов объявления бина вот и все. можешь его называть типа сам класс сервисом или компонентом а можешь вот так вот создать некий конфиг класс (он же бин, конфигурейшн аннотация это тоже аннотация что создает бин) и в нем объявлять так как ты показал. это лишь вопрос удобства в каком то конкретном случае.
...
Рейтинг: 0 / 0
18.08.2021, 13:20
    #40091472
springy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
self injection Spring?
chpasha

так в чем ваш вопрос?


Тогда, наверное, зачем нужно self injection? В чем смысл?:)
...
Рейтинг: 0 / 0
18.08.2021, 13:59
    #40091493
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
self injection Spring?
springy
зачем нужно self injection? В чем смысл?:)

давайте с терминами определимся, self injection это что? то, что я показал в первом куске кода или то что вы? то, что вы - ручное создание объектов
...
Рейтинг: 0 / 0
18.08.2021, 14:04
    #40091495
self injection Spring?
springyТогда, наверное, зачем нужно self injection? В чем смысл?:)
Self-injection - это хак, который решает проблему с проксями. Spring умеет оборачивать твои бины в прокси, которые добавляют логики перед и после вызова твоих методов. Получаем что-то вроде:
Код: java
1.
2.
3.
4.
5.
6.
7.
class Proxy extends A {
  private A realA;
  public void a() {
      doSomething(); // <-- additional proxy logic like starting transaction
      realA.a(); // <-- our real logic written by us
  }
}

Т.к. прокся наследуется от твоего изначального класса (в случае class proxy с CGLIB) либо реализует те же интерфейсы (в случае interface proxy с JdkDynamicProxy), то мы можем инжектить в другие классы наш же A и никто не будет знать что на самом деле это прокся:
Код: java
1.
2.
3.
public B(A a) {
   this.a = a; // <--- Proxy which extends A
}

Самый частый случай использования такого AOP - это @Transactional. Перед вызовом нашего метода мы хотим начать транзакцию, а затем сделать commit или rollback. Но что если твой класс A хочет вызвать метод из себя же:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A {
   @Transactional
   public void a() {
      a1();
   }

   @Transactional(propagation=REQUIRES_NEW)
   public void a1() {
    ...
   }
}

В таком случае получаем такую цепочку: b -> proxy.a() -> realA.a() -> realA.a1() . Т.е. последний вызов не проходит через проксю (мы ж просто внутри A вызываем свой же a1()). Обычно это и хорошо, но бывает так что нам надо чтоб @Transactional отработал на внутреннем методе. И в таком случае есть 3 варианта:

1. Самый глупый вариант - это собсно делать self injection , тогда мы в A получим ссылку на проксю (которая опять же ссылается на тот же A). И значит вызов пройдет через проксю которая начнет транзакцию.
2. Вынести a1() в другой класс
3. Использовать programmatic transaction management с помощью TransactionTemplate & TransactionManager.
...
Рейтинг: 0 / 0
18.08.2021, 15:15
    #40091525
springy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
self injection Spring?
Ок. Спасибо большое. Теперь понял для чего это затевалось. :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / self injection Spring? / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]