Добавление поставщика безопасности несколько раз в Java-приложение

У нас есть Java-приложение, в котором запланировано выполнение задания каждые 5 минут. В этом задании есть компонент безопасности, который делает следующее при каждом выполнении:

java.security.Security
            .addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

Мои вопросы:

  1. Требуется ли добавить в приложение поставщика безопасности несколько раз? Это служит какой-либо цели? Для меня это не имеет смысла, и достаточно добавить его один раз.
  2. Это кандидат на потенциальную утечку памяти в приложении?

Чтобы уточнить, я хочу добавить провайдера безопасности Bouncy Castle программно в моем приложении, а не статически через JRE. ИМО, достаточно добавить провайдера безопасности Bouncy Castle один раз в приложение, и мне не нужно делать это несколько раз.

1 ответ

Решение

В соответствии с addProvider Javadoc:

Возвращает:
предпочтительная позиция, в которой был добавлен поставщик, или -1, если поставщик не был добавлен, поскольку он уже установлен

addProvider уже проверяет, установлен ли поставщик, поэтому, даже если у вас есть несколько вызовов через приложение, оно будет добавлено только один раз. И после того, как вы добавите его, он останется там до остановки JVM (или если кто-то позвонит removeProvider).

Конечно, вы можете оптимизировать его и поместить только один вызов в основной класс (некоторый класс, который, как вы знаете, всегда загружается при запуске приложения), но я бы не стал сильно беспокоиться об этом.

Я работал с системами, которые имели более одного вызова addProvider в разных частях (потому что они могли быть вызваны в любом порядке и были независимы друг от друга), все работали в одной и той же JVM, и не было никаких утечек памяти. Конечно, это только мой случай, но я не осознаю, что это вызывает утечки.


Если вы хотите позвонить addProvider только если провайдер еще не добавлен, вы можете позвонить Security.getProvider() чтобы проверить это. Если провайдер отсутствует в JVM, он возвращает null:

// add provider only if it's not in the JVM
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
    Security.addProvider(new BouncyCastleProvider());
}
Другие вопросы по тегам