在Java应用程序中多次添加安全提供程序

问题描述:

我们有一个Java应用程序,计划每5分钟运行一次作业。在这个工作,存在安全组件,是否每次执行时间如下:在Java应用程序中多次添加安全提供程序

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

我的问题是:

  1. 需要它的安全提供多次在应用程序中添加?它有什么用途?对我来说,这是没有意义的,添加一次就足够了。
  2. 它是应用程序中潜在内存泄漏的候选者吗?

为了澄清,我想以编程方式在我的应用程序中添加Bouncy Castle安全提供程序,而不是通过JRE静态添加。国际海事组织,在应用程序中添加一次Bouncy Castle安全提供商就足够了,我不需要多次。

根据addProvider's 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()); 
}