With regard to @ActiveProfiles, that annotation is used on a test class, and the test instance is not a bean in an ApplicationContext, so a static declaration via profiles is the best we can offer other than the programmatic approach of a custom ActiveProfilesResolver.
However, in the case of caching, each annotated class is actually a bean in the ApplicationContext. So I'm wondering if it wouldn't make sense to evaluate the value attributes of @Cacheable, @CachePut, and @CacheEvict as SpEL expressions. That would enable developers to make programmatic, run-time decisions for which cache to use. This would essentially remove the need for an explicit CacheResolver API in Spring, since the SpEL expression could delegate to a bean in the context for this purpose (which may happen to implement a CacheResolver but wouldn't necessarily have to due to the dynamic method invocation nature of SpEL expressions).
And if you introduce a cacheManager attribute in @Cacheable, @CachePut, and @CacheEvict, I would also recommend that it simply be a String that can be evaluated as a SpEL expression, the result of which is the name of the cache manager bean to use. Like in the paragraph above, using a SpEL expression would avoid the need for any kind of special cache manager resolver API.