Os provedores são uma forma simples de estender e personalizar o tempo de execução JAX-RS. Você pode pensar neles como plug-ins que (potencialmente) alteram o comportamento do tempo de execução, a fim de cumprir um conjunto de objetivos (definidos pelo programa).
Os provedores não são iguais às classes de recursos, eles existem, conceitualmente, em um nível intermediário entre as classes de recursos e a implementação JAX-RS. Se ajudar, você pode pensar neles da mesma forma que os drivers de dispositivo (existentes entre o usuário e o espaço do kernel). Esta é uma ampla generalização.
Existem três classes de provedores definidas pela especificação JAX-RS atual. A semelhança entre eles é que todos os provedores devem ser identificados pela anotação @Provider e seguir certas regras para a declaração do construtor. Além disso, diferentes tipos de provedor podem ter anotações adicionais e implementarão diferentes interfaces.
Provedores de Entidade
Esses provedores controlam o mapeamento de representações de dados (como XML, JSON, CSV) para seus equivalentes de objeto Java.
Provedores de Contexto
Esses provedores controlam o contexto que os recursos podem acessar por meio de anotações @Context.
Provedores de exceção
Esses provedores controlam o mapeamento de exceções Java para uma instância de resposta JAX-RS.
Seu tempo de execução virá com vários provedores predefinidos que serão responsáveis por implementar um nível básico de funcionalidade (por exemplo, para mapear de e para XML, traduzir as exceções mais comuns etc etc). Você também pode criar seus próprios provedores conforme necessário.
A especificação JAX-RS é uma boa referência para ler esses diferentes tipos de provedores e o que eles fazem (consulte o Capítulo 4).