|
|
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
Есть ли какой-нибудь красивый способ заинжектить в бин его имя, кроме как implements BeanNameAware? А то реализовывать этот интерфейс - это же зависимость на спринг, а хочется, чтобы класс можно было бы использовать и без спринга. Можно сделать BeanPostProcessor, который будет через рефлекшен искать у каждого бина метод setBeanName, и если такой метод есть - то инжектить туда имя. Но этот метод недостаточно красив, т.к. если мы убираем implements BeanNameAware, то можно забыть, что setBeanName используется - и случайно стереть его. То есть, хочется одновременно и оставить implements BeanNameAware и в то же время хочется его убрать. И наследника заводить ради такой ерунды как-то несерьезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2016, 17:14 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
chabapok, а сделать Код: java 1. и его использовать? (без спринга заменить только его) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2016, 17:29 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2016, 17:44 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
не...у меня там не синглотн. am_sasaа сделать Код: java 1. и его использовать? (без спринга заменить только его) Да, тоже способ. Можно кстати с тем же успехом вообще ничего не наследовать. Там, где хочется переиспользовать этот бин без спринга, просто сделать свой интерфейс-заглушку с именем BeanNameAware и поместить его в тот же пакет org.springframework.beans.factory и закинуть в classpath. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2016, 12:11 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
chabapok, Можно написать свой BeanPostProcessor, который будет по какому-либо другому признаку без интерфейса определять нужно ли бину имя. Есть же какой-то общий признак у таких бинов? Даже duck typing для setBeanName не нужен. Ты ведь где-то это имя типовым способом используешь? Значит и хранение этого имени типовое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2016, 12:19 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
Вот эта идея: BlazkowiczДаже duck typing для setBeanName не нужен. Ты ведь где-то это имя типовым способом используешь? По наличию setBeanName(String) без BeanNameAware - это duck typing? имя хранится как правило в поле String name или beanName Используется по большей части для более информативных логов, и иногда чтобы передать в другую систему что-нибудь. Например, грубо говоря, a.b=50 означает, что в бине с именем "а" обновили переменную b. Иногда это имя используется как ключ в хэшмапах. По большому счету, бинов которые умеют BeanNameAware может быть много разных, и способы их использования могут быть разные. Так что проверять каким-то отличным от того что я описал образом - вроде как плохо. Например, если бинпостпроцессор будет искать метод getBN() который отдает имя, то в других классах такого метода может не оказаться - и имя не заинжектится. Но тут еще такой момент: смотреть на метод getBN() и инжектить имя - это тоже форма duck typing. Просто в одном случае мы проверяем "а крякает ли объект как утка", а в другом "а плавает ли как утка?". Так что есть подозрения, что я не понял вашу идею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2016, 19:38 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
chabapokПо наличию setBeanName(String) без BeanNameAware - это duck typing? Да. chabapokимя хранится как правило в поле String name или beanName Это достаточный признак? Или есть такие бины, куда инжектить не надо? chabapokИспользуется по большей части для более информативных логов, и иногда чтобы передать в другую систему что-нибудь. Например, грубо говоря, a.b=50 означает, что в бине с именем "а" обновили переменную b. Иногда это имя используется как ключ в хэшмапах. Хм. То есть не типовое. chabapokПо большому счету, бинов которые умеют BeanNameAware может быть много разных, и способы их использования могут быть разные. Так что проверять каким-то отличным от того что я описал образом - вроде как плохо. Например, если бинпостпроцессор будет искать метод getBN() который отдает имя, то в других классах такого метода может не оказаться - и имя не заинжектится. Но тут еще такой момент: смотреть на метод getBN() и инжектить имя - это тоже форма duck typing. Просто в одном случае мы проверяем "а крякает ли объект как утка", а в другом "а плавает ли как утка?". Так что есть подозрения, что я не понял вашу идею. Нет, всё правильно ты понял. Идея в том что тебе нужно определиться каким именно образом ты хочешь идентифицировать бины, которым нужно это имя. Можно даже кастомной аннотацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2016, 19:42 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
chabapok, А если создать свой интерфейс Код: java 1. 2. 3. 4. 5. 6. и уже для него сделать BeanPostProcessor, без рефлекшенов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2016, 19:54 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЭто достаточный признак? Или есть такие бины, куда инжектить не надо? Если мы смотрим в поле name - могут быть теоретически, на практике вряд ли наверно, но если вдруг будет - это будет трудноуловимый баг. BlazkowiczНет, всё правильно ты понял. Идея в том что тебе нужно определиться каким именно образом ты хочешь идентифицировать бины, которым нужно это имя. Можно даже кастомной аннотацией. Тогда, способ ясен. На первый взгляд мне показалось, что вообще достоинств смотреть в что-то отличное от setBeanName - нет. Но потом я подумал. Есть достоинство. Если мы, допустим, будем делать нашим постпроцессором setBeanName тем бинам, которые аннотированы какой-нибудь нашей аннотацией - то получается, что они должны быть одновременно и аннотированы и с методом setBeanName. Если потом idea сделает этот метод серым, и кто-нибудь его сотрет как ненужный - то будет экзепшен на этапе запуска. А если мы бинпостпроцессором будем смотреть только метод setBeanName, и по его наличию определять надо ли инжектить имя, то при стирании такого метода оно молча стартанет и никто никогда не узнает, что там незаинжекчено. Насколько я понял, это не было вашей идеей - но чисто интуитивно вы подсказали более хороший подход. pavel_nvchabapok, А если создать свой интерфейс и уже для него сделать BeanPostProcessor, без рефлекшенов Да, и такой вариант тоже возможен. Тогда там, где оно используется без спринга, понадобится этот интерфейс в classpath Пожалуй, возможные варианты перечислены. Они все не идеальны, но практически-юзабельны, так что остановлюсь на каком-нибудь из них. И можно еще, в порядке "скоро пятница" вспомнить, что javadoc тоже хранится в .class, и процессор аннотаций может туда заглянуть и что-то подкрутить в коде. Можно запилить что-нибудь типа https://github.com/benelog/multiline только про имена бинов... разумеется, я так не стану делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2016, 23:43 |
|
||
|
Как правильно в бин заинжектить его имя но при этом избежать зависимости на spring?
|
|||
|---|---|---|---|
|
#18+
chabapokвспомнить, что javadoc тоже хранится в .class Чиво? chabapok, и процессор аннотаций может туда заглянуть Аннотации это не javadoc chabapok,и что-то подкрутить в коде. Можно запилить что-нибудь типа https://github.com/benelog/multiline только про имена бинов... разумеется, я так не стану делать. Нет особого смысла. В BeanPostProcessor можно просто проверить аннотацию и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2016, 08:35 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39334286&tid=2123569]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 337ms |

| 0 / 0 |
