Добавление поставщика безопасности несколько раз в Java-приложение
У нас есть Java-приложение, в котором запланировано выполнение задания каждые 5 минут. В этом задании есть компонент безопасности, который делает следующее при каждом выполнении:
java.security.Security
.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Мои вопросы:
- Требуется ли добавить в приложение поставщика безопасности несколько раз? Это служит какой-либо цели? Для меня это не имеет смысла, и достаточно добавить его один раз.
- Это кандидат на потенциальную утечку памяти в приложении?
Чтобы уточнить, я хочу добавить провайдера безопасности 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());
}