Ограничить доступ к бобам / сервису / репозитору Sping для внешних jar / классов - PullRequest
0 голосов
/ 16 января 2020

У нас есть приложение Spring Boot, которое реализует сложную логику рабочего процесса c, которая может быть расширена / изменена для различных клиентов.

Для достижения этой цели мы предложили предоставить некоторые Java интерфейсы, которые клиенты могут реализовать извне, чтобы обеспечить настраиваемые логики рабочего процесса c и упаковать их в качестве jar для возврата.

Мы планируем поместить эти файлы JAR-клиента в какую-то внешнюю папку и добавить в путь к классу приложения весенней загрузки, при следующей перезагрузке эти файлы JAR будут видны приложению Spring, и будут действовать указанные классы c клиента. (Отражение или как @Component beans).

Есть проблема с этим подходом.

Как мы ограничиваем эти реализации клиентских внешних классов, чтобы они не использовали @Autowired или SpringContext.getBean или любые другие средства для незаконного доступа к нашим внутренним службам / репозиториям / компонентам или другим bean-компонентам, которые не связаны с их областью действия?

ИЛИ

Есть ли лучший подход к тому, чего мы пытаемся достичь?

1 Ответ

0 голосов
/ 16 января 2020

Вы можете ограничить видимость Spring Bean, определив bean-компонент в классе JavaConfig, используя различные модификаторы доступа. Используя эту функцию, вы можете явно создать bean-компонент (-ы), который требует зависимости в той же конфигурации, а не вводить зависимости с помощью компонентного сканирования. Рабочий пример можно найти в документации Spring :

@Configuration
public abstract class VisibilityConfiguration {

  @Bean
  public Bean publicBean() {
     Bean bean = new Bean();
     bean.setDependency(hiddenBean());
     return bean;
  }

  @Bean
  protected HiddenBean hiddenBean() {
     return new Bean("protected bean");
  }

  @Bean
  private HiddenBean secretBean() {
     Bean bean = new Bean("private bean");
     // hidden beans can access beans defined in the 'owning' context
     bean.setDependency(outsideBean());
  }

  @ExternalBean
  public abstract Bean outsideBean()
}

Обязательно определите реферат класса @Configuration, так как в противном случае вы получите ошибку, аналогичную @Bean method 'yourBean' must not be private or final; change the method's modifiers to continue.

Кроме того, в примере упоминается @ExternalBean, который можно использовать для объявления абстрактного компонента, который должен быть предоставлен внешней средой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...