Статьи

Прокси-сервер в Spring Framework

Spring Framework предоставляет возможности для весенних бобов.

Мы можем контролировать различные зависимости и значения конфигурации, которые подключаются к пружинному бобу, используя объем пружины.

Spring поддерживает следующие шесть областей. Четыре из шести доступны в веб-приложении:

Сфера Описание
одиночка Это область по умолчанию в Spring Framework. Для каждого контейнера Spring IOC будет создан только один экземпляр компонента.
Опытный образец Всякий раз, когда бин запрашивается из контекста, каждый раз будет создаваться новый экземпляр.
запрос Область действия определения бина до запроса HttpServlet. Для каждого нового запроса будет создаваться новый экземпляр компонента, он применим только для веб-приложений.
сессия Задайте определение компонента в сеансе Http, для каждого нового сеанса будет возвращаться новый экземпляр компонента, действительный только в контексте приложения Spring с веб-интерфейсом.
заявка Область применения определения компонента в ServletContext. Действительно только в контексте приложения Spring с веб-интерфейсом.
Веб-сокет Примените определение компонента к жизненному циклу сеанса WebSocket. Действителен только в контексте приложения Spring с веб-интерфейсом.

Spring Framework предоставляет интерфейсы для создания новых областей.

1. Области применения бобов как зависимости

Давайте предположим, что beanA имеет одноэлементную область, а beanB имеет прототипную область. Предположим, что beanA имеет зависимость beanB. Затем, без использования какой-либо дополнительной конфигурации, он обеспечивает случайное поведение, поскольку beanA будет иметь один экземпляр для контейнера, но beanB не будет иметь то же самое. Всякий раз, когда beanB запрашивается из контейнера, создается новый экземпляр.

Для решения таких проблем Java Spring Framework предоставляет концепцию, называемую прокси-компонентами.

Для зависимостей с меньшей областью действия, чем у родителя, платформа будет создавать прокси, а не создавать реальные объекты. Эти прокси будут расширять исходные объекты.

Когда бы ни вызывались методы из beanB, внутренне он будет вызываться для прокси-объекта, а не для реального объекта. Прокси-сервер попытается получить объект из контекста на основе области и вызовет для него оригинальный метод.
Например, SingletonScopedBean, PrototypeScopedBean — это два компонента с областями по умолчанию и областями прототипов соответственно.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public class SingletonScopedBean{
private PrototypeScopedBean prototypeScopedBean; 
    public String getState(){
        return this.prototypeScopedBean.getState();
    }
}
Public class PrototypeScopedBean{
    private final String state;
public String getState() {
        return state;
    }
public void setState() {
    this.state = UUID.randomUUID().toString();
}
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<bean id=”prototypeScopedBean” class=”org.example. PrototypeScopedBean” scope=”prototype” >
<aop:scoped-proxy/>
</bean>
<bean id=”singletonScopedBean” class=”org.example. SingletonScopedBean”>
<property name=”prototypeScopedBean” ref=”prototypeScopedBean”>
</bean>
</beans>

Это создаст прокси-компонент для prototypeScopedBean и подключит прокси к singletonScopedBean в качестве зависимости.

Всякий раз, когда метод getState () вызывается для bean-компонента prototypeScopedBean, он вызывает метод на прокси-сервере, а прокси-сервер разрешает экземпляр prototypeScopedBean и вызывает метод getState () для разрешенного объекта.

2. Прокси могут быть созданы двумя способами

  • JDK-прокси
  • CGLIB (динамический прокси) прокси на основе.

Для создания прокси на основе JDK класс должен быть реализован на одном из интерфейсов.

Для прокси на основе CGLIB это ограничение отсутствует.

Мы можем указать тип прокси с помощью атрибута proxy-target-class. Если значения верны, он создаст прокси CGLIB. Если значение равно false, он попытается создать прокси на основе JDK.

Подход к аннотации: Spring Framework предоставляет аннотацию @Scope для определения области. proxyMode — это атрибут аннотации для указания типа прокси.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
@Component
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class PrototypeScopedBean{
 private final String state;
public String getState() {
        return state;
    }
public void setState() {
    this.state = UUID.randomUUID().toString();
}
}
@Component
public class SingletonScopedBean{
    @Autowired
    private PrototypeScopedBean prototypeScopedBean;
   
    public String getState(){
        return this.prototypeScopedBean.getState();
    }
}

С учетом вышеизложенных изменений в качестве прокси-сервера у SingletonScopedBean будет использоваться тип компонента PrototypeScopedBean.

3. Scoped Proxy весной — Заключение

Мы изучили область действия Spring bean и как внедрить различные области видимости в bean-зависимостях. Мы также изучили различные типы режимов прокси.