Использование прокси-target-class= "true" с Spring beans

Я использую Jersey Rest и хочу, чтобы фильтр Джерси имел доступ к некоторым spring beans.

однако, как я обнаружил из других потоков, Джерси не получает spring beans, если они являются прокси-серверами Java, а не сгенерированными прокси-серверами Java. Я хочу добавить прокси-target-class= "true"

Каковы последствия этого, а также можно ли это просто установить на одном bean или его нужно установить на всех ссылочных beans?

Ответы

Ответ 1

Установив proxy-target-class="true", вы будете использовать CGLIB2 для своих прокси, вместо jdk proxys.

Последствия следующие, как описано в документации:

  • окончательные методы не могут быть рекомендованы, поскольку их нельзя переоценить.

  • Вам понадобятся бинарные файлы CGLIB 2 в вашем пути к классам, тогда как динамические прокси доступны в JDK. Spring будет автоматически предупреждать вас, когда ему нужны CGLIB, а классы библиотеки CGLIB не являются найденный на пути к классам.

  • Конструктор вашего прокси-объекта будет вызываться дважды. Это является естественным следствием прокси-модели CGLIB, в соответствии с которой подкласс генерируется для каждого проксируемого объекта. Для каждого проксированного экземпляра два создаются объекты: фактический прокси-объект и экземпляр подкласс, который реализует совет. Такое поведение не проявляется при использовании прокси-серверов JDK. Обычно вызов конструктора прокси-тип дважды, это не проблема, так как обычно есть назначений, и реальная логика не реализована в конструктор.

Кроме того, вы должны иметь возможность сделать "целевой-прокси" для определенного компонента с помощью

proxyMode=ScopedProxyMode.TARGET_CLASS

Ответ 2

Принуждение CGLib-Proxy, хотя контроллер формально реализует интерфейс (SpringBoot 1.2.3.RELEASE с Spring 4.1.6.RELEASE):

@Controller
@Scope( proxyMode = ScopedProxyMode.TARGET_CLASS )
public class ServiceImpl implements ServiceIntf
{ .... }

Это позволяет использовать действительные и рабочие @RequestMapping и @Transactional аннотации

Ответ 3

Используйте следующую аннотацию в Java Spring Config class:

@EnableAspectJAutoProxy (proxyTargetclass= true)