|
self injection Spring?
|
|||
---|---|---|---|
#18+
Подскажите, пдиз. Что-то не могу понять что это и зачем. Есть же вроде конструкции объявления бинов типа: Код: java 1. 2. 3. 4.
Из устных объяснений я так понял, что self injection существует как раз для того, что бы объявлять бины. Похоже я что-то не так понял или не до конца проникся. Поиском по форуму найти не удалось. Киньте какую-нибудь ссылку с подробностями. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 10:26 |
|
self injection Spring?
|
|||
---|---|---|---|
#18+
springy Из устных объяснений я так понял, что self injection существует как раз для того, что бы объявлять бины. по-моему тут какая-то путаница с терминами, self injection в спринге, это когда Код: java 1. 2. 3. 4. 5.
т.е. сам в себя инъектируется. а про что спрашиваете вы мне понятно не вполне. в приведенном вами примере мы видим ручное создание объекта, который потом где-то можно инъектировать посредством spring-а. конкретно ваш пример бессмыслен в виду того, что объект никак особе не инициализируется и его можно заменить автоматическим инстанциированием через spring, выкинув весь код. Но если добавить некий код, то ручное создание станет оправданным. Например Код: java 1. 2. 3. 4. 5. 6. 7.
сразу говорю - пример от балды, а то щас знатоки спринга заклюют - скажут, что в версии 6.0.1.SNAPSHOT такое можно стандартными средствами сделать так в чем ваш вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 12:15 |
|
self injection Spring?
|
|||
---|---|---|---|
#18+
springy Подскажите, пдиз. Что-то не могу понять что это и зачем. Есть же вроде конструкции объявления бинов типа: Код: java 1. 2. 3. 4.
Из устных объяснений я так понял, что self injection существует как раз для того, что бы объявлять бины. Похоже я что-то не так понял или не до конца проникся. Поиском по форуму найти не удалось. Киньте какую-нибудь ссылку с подробностями. то что ты показываешь это один из типов объявления бина вот и все. можешь его называть типа сам класс сервисом или компонентом а можешь вот так вот создать некий конфиг класс (он же бин, конфигурейшн аннотация это тоже аннотация что создает бин) и в нем объявлять так как ты показал. это лишь вопрос удобства в каком то конкретном случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 12:39 |
|
self injection Spring?
|
|||
---|---|---|---|
#18+
chpasha так в чем ваш вопрос? Тогда, наверное, зачем нужно self injection? В чем смысл?:) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 13:20 |
|
self injection Spring?
|
|||
---|---|---|---|
#18+
springy зачем нужно self injection? В чем смысл?:) давайте с терминами определимся, self injection это что? то, что я показал в первом куске кода или то что вы? то, что вы - ручное создание объектов ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 13:59 |
|
self injection Spring?
|
|||
---|---|---|---|
#18+
springyТогда, наверное, зачем нужно self injection? В чем смысл?:) Self-injection - это хак, который решает проблему с проксями. Spring умеет оборачивать твои бины в прокси, которые добавляют логики перед и после вызова твоих методов. Получаем что-то вроде: Код: java 1. 2. 3. 4. 5. 6. 7.
Т.к. прокся наследуется от твоего изначального класса (в случае class proxy с CGLIB) либо реализует те же интерфейсы (в случае interface proxy с JdkDynamicProxy), то мы можем инжектить в другие классы наш же A и никто не будет знать что на самом деле это прокся: Код: java 1. 2. 3.
Самый частый случай использования такого AOP - это @Transactional. Перед вызовом нашего метода мы хотим начать транзакцию, а затем сделать commit или rollback. Но что если твой класс A хочет вызвать метод из себя же: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В таком случае получаем такую цепочку: b -> proxy.a() -> realA.a() -> realA.a1() . Т.е. последний вызов не проходит через проксю (мы ж просто внутри A вызываем свой же a1()). Обычно это и хорошо, но бывает так что нам надо чтоб @Transactional отработал на внутреннем методе. И в таком случае есть 3 варианта: 1. Самый глупый вариант - это собсно делать self injection , тогда мы в A получим ссылку на проксю (которая опять же ссылается на тот же A). И значит вызов пройдет через проксю которая начнет транзакцию. 2. Вынести a1() в другой класс 3. Использовать programmatic transaction management с помощью TransactionTemplate & TransactionManager. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2021, 14:04 |
|
|
start [/forum/topic.php?fid=59&msg=40091410&tid=2120374]: |
0ms |
get settings: |
15ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
23ms |
get topic data: |
2ms |
get forum data: |
1ms |
get page messages: |
160ms |
get tp. blocked users: |
0ms |
others: | 281ms |
total: | 489ms |
0 / 0 |