The ContentNegotiationService SPI allows multiple implementations to be installed, and each are checked in turn (chain of responsibility pattern). If any can generate a representation of the result then this is used rather than the default RepresentationService.
The framework provides one default implementation: ContentNegotiationServiceXRoDomainType that handles "application/...;profile=...;x-ro-domain-type=..." for either XML or JSON, and for the main representations (object, property, collection, detail, action-result)
As a further sub-SPI, the ContentMappingService is used by the afore-mentioned ContentNegotiationServiceXRoDomainType to attempt to map the result domain object to another object before rendering. Typically this is to map a domain object to a corresponding DTO.