Использование type = { "a.b.c.Foo" }
будет компилироваться, даже если на вашем пути к классам нет класса a.b.c.Foo
, тогда как value = { a.b.c.Foo.class }
требует, чтобы Foo
был на вашем пути к классам хотя бы во время компиляции. Из-за природы аннотаций оба варианта могут быть выполнены, даже если a.b.c.Foo
отсутствует в пути к классам во время выполнения - по крайней мере, при некоторых обстоятельствах:
JavaDo c из @ConditionalOnClass.value
Поскольку эта аннотация анализируется путем загрузки байт-кода класса, можно с уверенностью указать здесь классы, которые могут в конечном итоге отсутствовать в пути к классам, только если эта аннотация находится непосредственно на уязвимом компоненте и не , если эта аннотация используется в качестве составной метааннотации. Чтобы использовать эту аннотацию в качестве метааннотации, используйте только атрибут {@link #name}.
Обычно аннотацию @ConditionalOnClass
можно использовать для выполнения конфигураций, зависящих от других классов. присутствовать.
Например, у вас могут быть разные конфигурации облачного хранилища AWS, GCP и Azure. Каждая из этих конфигураций регистрирует компонент CloudUpload
. А с @ConditionalOnClass
вы выполняете только ту конфигурацию, которая в настоящее время действительна, т.е. если AWS SDK находится на пути к классам, вы конфигурируете bean-компонент S3CloudUpload
, ...
Это просто путем адаптации вашего развертывание / classpath вы настраиваете свое программное обеспечение другим способом.