Fala Thiago, tudo bem ?
Sobre essa questão de reutilização de código e a adoção de estratégias pra chegar nesse objetivo depende muito do caso.
Vou passar uma experiência pessoal dentro dos projetos que participei pra tentar exemplificar.
Pegando um exemplo simples e de conhecimento geral como boa prática: Códigos de negócio (ou utilitários ao negócio) que devem ser reutilizados por diversas aplicações/serviços em geral acabam sendo refatorados pra algo mais genérico e são reaproveitados como libs que nos demais projetos.
Quando falamos sobre os códigos de configuração poderíamos seguir o mesmo princípio (refatorar pra algo genérico e distribuir como lib), mas não é tão simples, pois em geral muitos detalhes são particulares e podem mudar totalmente de um projeto para o outro (embora o código e classes de configuração programática sejam repetitivos quando aparecem).
Algumas iniciativas surgiram justamente pra facilitar a vida nesse sentido. Imagine que a gente tentasse seguir aquele princípio de escrever o código genérico... Poderíamos isolar os códigos de configuração em classes nossas reaproveitáveis, que ao invés de "chumbar" os valores usados pela configuração particular de um projeto, buscassem esses valores em outras fontes (argumentos passado via linha de comando ao subir o server, arquivos chave-valor na estrutura de projeto). Dessa forma poderíamos reutilizar essa lib em outro projeto, bastando passar os valores que mudam. Pois é, foi justamente essa a motivação de um dos projetos de maior sucesso do Spring. O framework Spring Boot é o cara que vai te ajudar a esquecer (senão todos, a grande maioria) os códigos de configuração.
A ideia desse projeto é justamente trazer essa implementação pronta pra nós, prover todas as classes de configuração (que eles nomeiam no estilo DataSourceAutoConfiguration, CacheAutoConfiguration, XPTOAutoConfiguration), e adivinha... o código delas já vai buscar chaves específicas (descritas na documentação) em um arquivo que deve constar com o nome de application.properties
, em src/main/resources (na maioria dos casos), em um projeto baseado no SpringBoot. Dê uma olhada nesse projeto. Hoje é fundamental que o dev que esteja aprendendo/utilizando a stack do Spring saiba usar o Boot.
Ah! em casos onde você não queira adotar o Spring Boot no seu projeto (o que tem se tornado cada vez mais difícil dada a facilidade que ele provê) e queira continuar um projeto Spring tradicional, você pode usar as apps (de outra natureza) que geram o código base de configuração (como um boilerplate todo pronto pra iniciar o projeto) e você só altera os valores. Um que já usei muito é o SetupMyProject. Ele é como um wizzard onde você vai preenchendo o que precisa no projeto (Spring, JPA com Hibernate, Java 8, etc, etc) e no final ele gera o código base do projeto te devolvendo um zip que você importa na IDE e sai desenvolvendo.
Espero ter ajudado. Abraço!