powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Как проинициализировать Bean значениями из БД
19 сообщений из 44, страница 2 из 2
Как проинициализировать Bean значениями из БД
    #40053311
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
А ты не пробовал вникать, когда и почему Not recommended?

Пробовал и прекрасно знаю почему ,поэтому и ответил в теме этой

no way to unit test without reflection or a Spring container-одна из основных наверно причин,почему @Autowired явлеяется признаком плохого кода
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053314
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
asv79
Уточните из какой деревни JetBrains ,которые пишут , что @Autowired is not recommended.


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

По сонар кубу я ничего не могу сказать ,ибо я с ним не сталкивался ( видимо и слава богу) ,на одном из мест работы я столкнулся с чем то подобным не помню названия PWD или что то рядом- который на подобии сонара чекал код перед сборкой,а сборка в дженкинсе была настроена так ,что если варны идут - то ничего не собирается- там да до каждого пробела и запятой домогались и надо сказать это порядком надоедало
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053315
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
прекрасно знаю почему ,поэтому и ответил в теме этой

что-то не похоже. у нас здесь field injection? у нас здесь есть что-то, что можно протестировать без spring?
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053318
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
asv79
прекрасно знаю почему ,поэтому и ответил в теме этой

что-то не похоже. у нас здесь field injection? у нас здесь есть что-то, что можно протестировать без spring?

а разве нет? мокни репу и делай что хочешь,зачем тут спринг или ты собрался тестить jdbc драйвер?
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053325
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
а разве нет?

нет - у нас java based spring config здесь и бин, в который при создании нужно заинжектить зависимость из другого конфига
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053327
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
no way to unit test without reflection or a Spring container-одна из основных наверно причин,почему @Autowired явлеяется признаком плохого кода


у того, кто писал этот бред, определенно существуют трудности с пониманием происходящего в современной разработке:
1. зависимость от spring - это не плохо и не хорошо, это просто зависимость от spring, писать код исходя из того, что он может в какой-то момент переехать на другой DI - откровенно говоря, так себе затея, при этом @Autowired при таком переезде особых трудностей вызывать не будет - в спринге полно более других выкрутасов, которые поддерживаются только спрингом и нигде больше. Поэтому нужно четко осозновать, что если кто-то начинает ссать в уши что у тебя в проекте зависимость от конкретного DI и это плохо, то перед тобой м*удак.
2. Относительно возможности "собрать бин руками" как таковой: чтобы значь начать дискутировать нужно для начала прояснить несколько вещей:
- нужно открыть проект, заглянуть в src/test и посчитать сколько раз там такое делается: чет есть ощущение, что руками зависимости никто уже давно не собирает в виду сложности и бесполезности процесса
- осознать, что чтобы убедиться в работоспособности спрингового контекста, его так или иначе придется поднять, а зачем тогда собирать зависимости вручную?
3. DI через поля откровенно лучше чем через сеттеры, по двум причинам:
- оно по крайней мере делает вид, что бины не мутируют
- оно побуждает писать дальнейший код более правильно (инициализация в @PostConstruct или по событию, а не сразу в сеттере или конструкторе)
4. DI через конструкторы (то как рекомендуют упоротые разработчики JetBrains) - это совершенная дичь, а не рекомендация: если проект хоть капельку сложный, то появление в нем циклических зависимостей - это всего лишь вопрос времени, с циклическими зависимостями принято бороться или глобальным рефакторингом или шлепаньем @Lazy, использование @Lazy несет ряд проблем, самая серьезная заключается в том, что зависимости, помеченные @Lazy разрешаются исключительно в рантайме при попытке к ним обратиться, при этом нет никаких гарантий, что если граф зависимостей разрешился-таки на одном окружении, то он разрешится и на другом

итого имеем:
- на одной чаше весов прямой код и отсутствие пороховой бочки в виде рантайма, который готов в каждую минуту развалиться
- на другой чаше весов какие-то заблуждения 15-летней давности со всеми вытекающими
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053329
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha

нет - у нас java based spring config здесь и бин, в который при создании нужно заинжектить зависимость из другого конфига
Если обсуждать конкретный код, то там @Autowired не нужен
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053331
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема переезда на другие DI - интересная тема. Мы рассматриваем Dagger, как альтернативу Spring
для легковесных Servel-Less функций для амазончика. Пытались также рассматривать Guice, Quarkus.
Quarkus пока не пошел по причине что никто не компетентен. Все пожимают плечами. Guice на рассмотрении.

В данном форуме я-бы для начала поднял голосование на тему того, какие именно фичи являются определяющими в данный
момент для фреймворка. Если DI - это Пареттовские 80% желаемых фич - тогда Spring ничем особо не примечателен
и можно спокойно брать другие инжекторные двигатели и для нового проекта ничего по сути не меняется,
но избавляемся от лишних мегабайт зависимостей.
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053332
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
asv79
а разве нет?

нет - у нас java based spring config здесь и бин, в который при создании нужно заинжектить зависимость из другого конфига

все это тут не нужно от слова совсем

делается это гораздо проще и удобней
через @Service->@RequiredArgsConstructor->pr
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Reposotory
public interface SomeRepo{}

@RequiredArgsConstructor
public class CheckDt{

private final SomeRepo repo;

private List<SomeData> someDataList;

public List<SomeData> getSomeDataList(){
return repo.findAll();



зачем вот это все в видео конфигов каких и бинов руками созданных?
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053340
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов

- на одной чаше весов прямой код и отсутствие пороховой бочки в виде рантайма, который готов в каждую минуту развалиться
- на другой чаше весов какие-то заблуждения 15-летней давности со всеми вытекающими

@Autowired не дает возможности сделать это поле имутейбл например
а вообще вот тут хорошо написано - почему это плохо

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Field-based dependency injection drawbacks
Disallows immutable field declaration
Field-based dependency injection won’t work on fields that are declared final/immutable as this fields must be instantiated at class instantiation. The only way to declare immutable dependencies is by using constructor-based dependency injection.

Eases single responsibility principle violation
As you know, in object-oriented computer programming, the SOLID acronym defines five design principles that will make your code understandable, flexible and maintainable.

The S in SOLID stands for single responsibility principle, meaning that a class should only be responsible for a single part of the functionality of the software application and all its services should be aligned narrowly with that responsibility.

With field-based dependency injection, it’s really easy to have lots of dependencies in your class and everything will look just fine. If constructor-based dependency injection is used instead, as more dependencies are added to your class, the constructor grows bigger and bigger and code starts to smell, sending clear signals that something is wrong.

Having a constructor with more than ten arguments is a clear sign that the class has too many collaborators and that maybe is a good time to start splitting the class into smaller and more maintainable pieces.

So although field-injection is not directly responsible for breaking the single responsibility principle it surely enough helps by hiding signals that otherwise would be really clear.

Tightly coupled with dependency injection container
The main reason to use field-based injection is to avoid the boilerplate code for getters and setters or creating constructors for your class. In the end, this means that the only way these fields can be set are by Spring container instantiating the class and injecting them using reflection, otherwise the fields will remain null and your class will be broken/useless.

The dependency injection design pattern separates the creation of class dependencies from the class itself transferring this responsibility to a class injector allowing the program design to be loosely coupled and to follow the Single responsibility and Dependency inversion principles (again SOLID). So in the end the decoupling achieved for the class by autowiring its fields is lost by getting coupled again with the class injector (in this case Spring) making the class useless outside of a Spring container.

This means that if you want to use your class outside the application container, for example for unit testing, you are forced to use a Spring container to instantiate your class as there is no other possible way (but reflection) to set the autowired fields.

Hidden dependencies
When using a dependency injection pattern, affected classes should clearly expose these dependencies using a public interface either by exposing the the required dependencies in the constructor or the optional ones using methods (setters). When using field-based dependency injection, the class is inherently hiding these dependencies to the outside world.
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053341
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Тема переезда на другие DI - интересная тема. Мы рассматриваем Dagger, как альтернативу Spring
для легковесных Servel-Less функций для амазончика. Пытались также рассматривать Guice, Quarkus.
Quarkus пока не пошел по причине что никто не компетентен. Все пожимают плечами. Guice на рассмотрении.

В данном форуме я-бы для начала поднял голосование на тему того, какие именно фичи являются определяющими в данный
момент для фреймворка. Если DI - это Пареттовские 80% желаемых фич - тогда Spring ничем особо не примечателен
и можно спокойно брать другие инжекторные двигатели и для нового проекта ничего по сути не меняется,
но избавляемся от лишних мегабайт зависимостей.

тут дело не в переезде а в обчном юнит тестировании

This means that if you want to use your class outside the application container, for example for unit testing, you are forced to use a Spring container to instantiate your class as there is no other possible way (but reflection) to set the autowired fields.

по поводу @Lazy - у нас достаточно сложный проект ( даже близко не энтерпрайз) и нет ни одного класса с @Autowired ,между тем у нас нет ни каких проблем с цикличностью и инициализацией коллекций .
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053342
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
Андрей Панфилов

- на одной чаше весов прямой код и отсутствие пороховой бочки в виде рантайма, который готов в каждую минуту развалиться
- на другой чаше весов какие-то заблуждения 15-летней давности со всеми вытекающими

@Autowired не дает возможности сделать это поле имутейбл например
а вообще вот тут хорошо написано - почему это плохо


Стас, попробуй своими словами описать, а не приводить цитаты очередного бреда из интернета... там испанский имбецил (чисто к сведению: испанцы еще хуже индусов) пишет примерно следующее: "я когда делаю DI через конструкторы то я начинаю замечать, что код выглядит так себе, потому что у конструкторов много параметров, а при использовании @Autowired я этого не замечаю..."

Ну тут ему нужно или посоветовать использовать lombok, чтобы тоже не замечать, или голову-таки включить.
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053346
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
asv79
пропущено...

@Autowired не дает возможности сделать это поле имутейбл например
а вообще вот тут хорошо написано - почему это плохо


Стас, попробуй своими словами описать, а не приводить цитаты очередного бреда из интернета... там испанский имбецил (чисто к сведению: испанцы еще хуже индусов) пишет примерно следующее: "я когда делаю DI через конструкторы то я начинаю замечать, что код выглядит так себе, потому что у конструкторов много параметров, а при использовании @Autowired я этого не замечаю..."

Ну тут ему нужно или посоветовать использовать lombok, чтобы тоже не замечать, или голову-таки включить.

ну я с тем что он пишет согласен) кроме того конечно - что с конструктором проще уведеть что ваш класс уже не отвечает SOLID
например юнит тестирование- тут сложно поспорить - мы тестируем отдельно взятый класс- зачем мне подымать под это дело спринг? а если этих тестов тысячи?ждать по полгода пока проект соберется в тим сити,который и так тормознутый

я лично против @Autowirerd только изза тестирования
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053353
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
@Autowired явлеяется признаком плохого кода

asv79
я лично против @Autowirerd только изза тестирования

asv79
тим сити,который и так тормознутый


Очевидно что ты гонишь. тим сити делает разве что mvn test/verify в зависимости от, у вас тесты просто писать не умеет никто.
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053354
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
asv79
@Autowired явлеяется признаком плохого кода

asv79
я лично против @Autowirerd только изза тестирования

asv79
тим сити,который и так тормознутый


Очевидно что ты гонишь. тим сити делает разве что mvn test/verify в зависимости от, у вас тесты просто писать не умеет никто.

я не гоню) тим сити перед сборкой запускает тесты и если это спринговые тесты( а с автовайред это только они)
то это очень долго.
Тесты я сам пишу и там нет ничего необычного - разница лишь в контексте ,но спринговые тесты объективно и по понятным причинам гораздо медленней обычного юнит теста

что такое обычный юнит тест
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class FuckingMapperTest {

  @Mock
  private FukinRepo faukinRepository;
  @Mock
  private FukinRepo faukinRepository;
  @Mock
  private FukinRepo faukinRepository;
  @Mock
  private FukinRepo faukinRepository;
  @Mock
  private FukinRepo faukinRepository;
  @Mock
  private FukinRepo faukinRepository;

  @InjectMocks
  private FuckingMapper fuckingMapper;

  @BeforeEach
  void setUp() {
    MockitoAnnotations.openMocks(this);




а со спрингом это выглядит вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@ContextConfiguration(classes = {FuckingMapper.class})
@ExtendWith(SpringExtension.class)
class FuckingMapperTest {

  @MockBean
  private FukinRepo faukinRepository;
  @MockBean
  private FukinRepo faukinRepository;
  @MockBean
  private FukinRepo faukinRepository;
  @MockBean
  private FukinRepo faukinRepository;
  @MockBean
  private FukinRepo faukinRepository;
  @MockBean
  private FukinRepo faukinRepository;

  @Autowired
  private FuckingMapper fuckingMapper;


эти два теста тестриуют один и тот же функционал( специально переписал под спринг посмотреть)
и спринговый тест медленней в разы( насколько не мерял) но и так понятно
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053359
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79,

т.е. там по десятку зависимостей везде, а ты при этом тут что-то про SOLID рассказываешь?
и да, судя по тому что ты привел, тесты действительно писать не умеете.
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053365
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
asv79,

т.е. там по десятку зависимостей везде, а ты при этом тут что-то про SOLID рассказываешь?
и да, судя по тому что ты привел, тесты действительно писать не умеете.

десятка там нет,всего 6 ) но да ладно
и чем тебе сии тесты не угодили?замечу лишь то,что это две интепритации с конструктор инжектинг,филд инжектов у нас нет и руками писать их лень,поэтому провел сравнительный анализ на том ,что было.
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053374
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
Если обсуждать конкретный код, то там @Autowired не нужен
да кто ж упомнит все эти тонкости. Он и на конструкторах уже не нужен.

asv79
делается это гораздо проще и удобней
через @Service->@RequiredArgsConstructor->pr

Понятное дело проще - дурное дело оно ж не хитрое. Но как же SOLID? Объясни мне, зачем классу, которому для работы нужна некая коллекция строк, впендюривать в зависимости целый dao?
...
Рейтинг: 0 / 0
Как проинициализировать Bean значениями из БД
    #40053385
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
Андрей Панфилов
Если обсуждать конкретный код, то там @Autowired не нужен
да кто ж упомнит все эти тонкости. Он и на конструкторах уже не нужен.

asv79
делается это гораздо проще и удобней
через @Service->@RequiredArgsConstructor->pr

Понятное дело проще - дурное дело оно ж не хитрое. Но как же SOLID? Объясни мне, зачем классу, которому для работы нужна некая коллекция строк, впендюривать в зависимости целый dao?

затем что вы этого хотите?если не устраивает - то это вопрос архитектуры скорей- нужно значит делать какие то слои ,которые работают с дао и выдают вам по требванию нужные коллекции /сингл значения
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как проинициализировать Bean значениями из БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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