Кажется, что -Wl, -rpath здесь не эффективен.
blockquote>Вероятно, что ваш обновленный компоновщик испускает динамический тег
DT_RUNPATH
, в котором исходит старый компоновщикDT_RPATH
. (Возможно также, что ваш старый компоновщик был GNU-ld, а новый - Gold.)Предпочтительнее
DT_RUNPATH
, а также влияет на путь поиска самого двоичного файла, но не любая из зависимых библиотек.
DT_RPATH
имеет глобальный эффект, подобно добавлению каталога в переменную средыLD_LIBRARY_PATH
.Вы можете проверить это с помощью:
readelf -d a.out | grep 'R.*PATH'
.Если вы видите разницу
RPATH
противRUNPATH
и фактически используете Gold, вы можете заставить «старое» поведение с-Wl,--disable-new-dtags
(GNU ld
также--disable-new-dtags
добавлен к нему недавно, поэтому он должен работать для любого линкера).
В большинстве случаев вы должны пойти с инъекцией, потому что:
MyServiceImpl
, так как он управляет этим объектом Даже если ваша служба не имеет интерфейса, из-за второго Причина, по которой вам следует рассмотреть инъекцию.
Единственный случай, когда вы можете пропустить Spring, - это когда класс не имеет зависимостей и не имеет апатридов. Но, скорее всего, такой класс - это утилита, которая вообще не нуждается в каком-либо экземпляре, поскольку она имеет только static
членов.
Это будет зависеть от того, является ли MyService bean, который имеет состояние или нет. Если MyService не имеет состояния, тогда вам не нужно создавать новые экземпляры, и вы можете позволить Spring вставить его с преимуществами, описанными выше