|
|
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Вопрос навеян походом на собеседование. Собственно нагуглил такую вот статью https://prasanthnath.wordpress.com/2013/03/21/injecting-a-prototype-bean-into-a-singleton-bean/ пробую воспроизвести. Написал hello world код: Код: java 1. 2. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. конфиг: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. main: Код: java 1. 2. 3. 4. 5. Почему всё равно true? я не понял о чем в статье написано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 17:00 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
потому, что: Код: java 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 17:24 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
no56892потому, что: Код: java 1. ? конечно true. singleton же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 17:52 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
НО при конфигурации Код: xml 1. 2. 3. 4. 5. 6. 7. и немного меняем код бина: Код: java 1. 2. 3. 4. 5. 6. будет false ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 17:54 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
судя по статье можно как-то и через Код: xml 1. но они много оставляют за кадром. Мне не понятно как это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 17:55 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
вот то же самое пишут http://www.java-allandsundry.com/2012/08/spring-scoped-proxy.html но блин... не работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 18:07 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Тут же все просто. Надо представить себя контейнером Spring и в точности выполнить то, что описано конфигом. В первом случае экземпляр com.example.domain.ValidatorHolder создается один раз. Поле myValidator заполняется один раз, поэтому то, что getMyValidator() всегда возвращает одно и тоже, удивлять не должно. То, что там добавили aop:scoped-proxy -- да какая разница? Экземпляр создавали один раз, myValidator заполняли один раз, какое время жизни предполагалось у того MyValidator уже не важно. Он теперь в синглтоне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 18:29 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Во втором случае мы подменяем метод getMyValidator. Подмененный метод уже возвращает не поле, а бин из контейнера. Вот тут уже время жизни бина имеет значение. Мы же теперь фактически каждый раз в getMyValidator() делаем xmlContext.getBean("validator"). Что там пишут в статьях не читал. У Спринга такая документация, что статей и не надо. Ответы на все вопросы всегда находил там. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 18:36 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Ну и про <aop:scoped-proxy>. Отличие будет заметно, если у MyValidator сделать свойство гарантированно разное у разных экземпляров. Как-то так: Код: java 1. 2. 3. 4. 5. 6. Вот тут будет сюрприз: Код: java 1. 2. будет false. Подозреваю, из-за того, что <aop:scoped-proxy> указан у бина со scope="prototype", даже такое: Код: java 1. будет false. Это я сейчас как Spring-контейнер написал. Ничего не проверял. Как-никак 21:50 воскресенья. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 18:54 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Alexander A. Sak, да, всё верно. Но я что-то концепцию aop-proxy не осознал. Можете чуть детальнее почему 2 объекта указывают на один и тот же бин, но при этом у них разный prop ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 19:36 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Alexander A. Sak, Я чего-то не могу понять, неужели без этой аннотации не прокси будет подставлен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2015, 20:47 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Наверное чтобы это понять мне надо понять как происходит процесс инжектинга для прокси. Для сеттер инжектинга всё понятно. Контейнер вызывает конструктор для бина, который надо инстанциировать. Затем через сеттеры инжектит зависимости. а для прокси вообще не очень понятно. Можно наверное отнаследоваться от класса, который надо инстанциировать... видимо через рефлекшн сможем добраться до приватного поля. таким образом получили наследника, у которого есть сеттеры. Но вроде как по этой логике каждому бину будет соответствовать своя прокся...у меня не так получилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 00:49 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Up ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 13:48 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
полено будет посмотреть , чтобы не задави на собеседовании - будете знать ответ : ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 13:50 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Atum1, Он про look up method только рассказал. Это мне очевидно и понятно. С прокси непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 21:49 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Ну хотя таргет класс это наверное то есть...но это не отвечает на мои вопросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 22:01 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
questionerНаверное чтобы это понять мне надо понять как происходит процесс инжектинга для прокси. Для сеттер инжектинга всё понятно. Контейнер вызывает конструктор для бина, который надо инстанциировать. Затем через сеттеры инжектит зависимости. а для прокси вообще не очень понятно. Можно наверное отнаследоваться от класса, который надо инстанциировать... видимо через рефлекшн сможем добраться до приватного поля. таким образом получили наследника, у которого есть сеттеры. Но вроде как по этой логике каждому бину будет соответствовать своя прокся...у меня не так получилось В свойство вместо настоящего бина инъектируется прокси. Когда происходит обращение к этой прокси, то Spring может найти подходящий экземпляр соответствующий scope и делегировать вызов ему. Таким образом scope вызываемого бина может отличаться от вызывающего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 10:24 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Я тоже так понял - BlazkowiczКогда происходит обращение к этой прокси, то Spring может найти подходящий экземпляр соответствующий scope и делегировать вызов ему Объясните, пожалуйста тогда почему авторvalidatorHolder21.getMyValidator() == validatorHolder21.getMyValidator(); // Это true validatorHolder21.getMyValidator().getProp() == validatorHolder21.getMyValidator().getProp(); // А это false ведь каждый раз при обращении к проксЕ должна быть вызвана нужная прокся. а вот если уже к методу прокси обращаться, то становится очевидно, что происходит обращение к новой проксЕ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 10:41 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
questionerAtum1, Он про look up method только рассказал. Это мне очевидно и понятно. С прокси непонятно. смотрите тогда оба видео внимательно там про все есть и про прокси так же ... все ответы на все ваши вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 15:57 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
questionerОбъясните, пожалуйста тогда почему авторvalidatorHolder21.getMyValidator() == validatorHolder21.getMyValidator(); // Это true validatorHolder21.getMyValidator().getProp() == validatorHolder21.getMyValidator().getProp(); // А это false ведь каждый раз при обращении к проксЕ должна быть вызвана нужная прокся. а вот если уже к методу прокси обращаться, то становится очевидно, что происходит обращение к новой проксЕ. Потому что после указания <aop:scoped-proxy/> то, что возвращает getMyValidator(), уже не наш MyValidator, а другой объект с какими-то такими методами: Код: java 1. 2. 3. Раз бин "validator" объявили scope="prototype", каждый вызов getProp() будет возвращать новый объект. Кстати, в доке Спринга написано: You do not need to use the <aop:scoped-proxy/> in conjunction with beans that are scoped as singletons or prototypes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 18:58 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Alexander A. Sak, видео посмотрел, непонятки остались) причём какие-то глобальные и фундаментальные Код: java 1. выводит: Код: java 1. 2. consolecom.example.domain.MyValidator@2462cb01 com.example.domain.MyValidator@19b843ba меня учили, что ссылки равны, если адрес в памяти один и тот же. Чего за фигня? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2015, 00:37 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
[quot Alexander A. Sak] Потому что после указания <aop:scoped-proxy/> то, что возвращает getMyValidator(), уже не наш MyValidator, а другой объект с какими-то такими методами: /quot] так почему getMyValidator() возвращает одну и ту же (на ==) прокси. Но вызов каждого метода на этой прокси уникален ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2015, 00:50 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
up ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 16:34 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
Atum1полено будет посмотреть , чтобы не задави на собеседовании - будете знать ответ : ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2015, 00:45 |
|
||
|
Spring. Инжектить бины с разным скоупом друг в друга.
|
|||
|---|---|---|---|
|
#18+
questioner Код: java 1. Сказал, что плохо, что нечто создаётся каждый раз. Что именно создаётся каждый раз я так и не понял. На какой минуте об этом речь? Scope=prototype знаем вообще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2015, 09:28 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39087713&tid=2124660]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 331ms |

| 0 / 0 |
