Все ли весенние бобы проксируются? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь получить общее представление о том, как работает прокси 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 используется здесь / где-либо для прокси, я понимаю, что он манипулирует байтовым кодом для создания прокси. В некоторых статьях я мог прочитать, что такой подход представляет угрозу безопасности. Я хотел бы понять, действительно ли это проблема, и если да, то как это повлияет на приложение?

1 Ответ

0 голосов
/ 06 мая 2020

Если вы хотите понять, как работают прокси Spring, у меня для вас есть два источника:

  • мой ответ здесь который концептуально объясняется с помощью примера кода (но без использования Spring, просто простые POJO) как работают прокси Spring.
  • руководство Spring, глава «понимание прокси Spring»
...