Я пытаюсь получить общее представление о том, как работает прокси Spring. Почему я должен использовать шаблон «API Interface & Impl Bean» или только шаблон «Bean Class» в моем приложении. Я прочитал довольно много ответов SO, но все они очень старые, в основном относящиеся к Java 7 с Spring 3.x , я считаю. Я хотел бы знать, что еще актуально в 2020 году для Java 11+ с Spring 5.x (Spring Boot 2.x) . Есть ли какие-то «лучшие практики», которым можно следовать?
Кроме того, с доступностью @FunctionalInterface
, если у меня есть bean-компоненты, реализующие такие интерфейсы, как Consumer
, Function
, Predicate
и аналогичные единицы, имеет ли смысл использовать @Autowire/@Inject
Consumer<A>
вместо Foo
где Foo implements Consumer<A>
. Это всего лишь пример, я мог бы использовать собственные функциональные интерфейсы (с универсальными шаблонами или без них).
Учитывая все вышесказанное, я также хотел бы знать, является ли каждый bean-компонент, созданный Spring проксируется, или Spring создает beans без их проксирования, если это на самом деле не требуется. Например, если класс просто аннотируется @Component
и вводится напрямую, никаких других аннотаций или требований прокси-сервера Spring по-прежнему создает прокси для этого bean-компонента?
Некоторые вопросы, на которые я уже отвечал:
ОБНОВЛЕНИЕ 7 мая 2020 г .:
Прочитав еще несколько статей, комментариев и ответов, я хотел бы поговорить о точная проблема / запрос, который я имею в виду. Рассмотрим следующий пример. У меня есть классы Foo
и AnotherFoo
.
@Component
@RequiredArgsConstructor // From lombok
class Foo extends Consumer<Bar> {
// Some private final Fields
public void accept(Bar bar) {
// do something
}
// Some private methods, no other public method
}
Вариант 1:
@Component
@RequiredArgsConstructor // From lombok
class AnotherFoo {
private final Foo foo;
// Use foo only to call foo.accept(bar)
}
Вариант 2:
@Component
@RequiredArgsConstructor // From lombok
class AnotherFoo {
private final Consumer<Bar> foo;
// Use foo only to call foo.accept(bar)
}
Теперь в приведенном выше случае, если мы говорим с точки зрения проксирования bean-компонента Foo
с помощью Spring, что может быть лучшим способом записи AnotherFoo
- Option 1 или Вариант 2 или, может быть, не имеет значения, как написано AnotherFoo
. Я не использую @EnableAspectJAutoProxy
нигде в коде, поэтому здесь все работает по умолчанию, скорее всего, аналогично Случай 3 из A2 этого вопроса SO .
Дополнительный вопрос : Кроме того, если CGLib используется здесь / где-либо для прокси, я понимаю, что он манипулирует байтовым кодом для создания прокси. В некоторых статьях я мог прочитать, что такой подход представляет угрозу безопасности. Я хотел бы понять, действительно ли это проблема, и если да, то как это повлияет на приложение?