Implementação Básica
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ServicoInicializacao {
@PostConstruct
public void inicializar() {
carregarParametros();
prepararRecursos();
}
private void carregarParametros() {
System.out.println("Configurações carregadas");
}
private void prepararRecursos() {
System.out.println("Recursos inicializados");
}
}
Saída durante inicialização:
...
ServicoInicializacao: Configurações carregadas
ServicoInicializacao: Recursos inicializados
...
Cenários de Aplicação
Pré-carregamento de cache:
@Component
public class GerenciadorCache {
private Map<String, Dado> cache;
@PostConstruct
void preencherCache() {
cache = new HashMap<>();
cache.put("chave", buscarDadosIniciais());
}
}
Validação de configuração:
@Configuration
public class ConfiguracaoApp {
@Value("${limite.conexoes}")
private int limite;
@PostConstruct
void validarConfig() {
if (limite < 1)
throw new RuntimeException("Limite de conexões inválido");
}
}
Registro de componentes:
@Component
public class CentralEventos {
@Autowired
private PublicadorEventos publicador;
private List<Ouvinte> ouvintes = new ArrayList<>();
@PostConstruct
void registrarOuvintes() {
ouvintes.add(new OuvinteLog());
ouvintes.forEach(publicador::adicionarOuvinte);
}
}
Comparação com InitializingBean
// Via @PostConstruct
@Component
class ServicoA {
@PostConstruct
void iniciar() { /* Lógica 1 */ }
}
// Via Interface
@Component
class ServicoB implements InitializingBean {
@Override
public void afterPropertiesSet() { /* Lógica 2 */ }
}
// Ordem: @PostConstruct → afterPropertiesSet()
Inicialização de Recursos Complexos
@Configuration
public class ConfigBanco {
@Value("${db.url}") private String url;
private DataSource fonteDados;
@PostConstruct
void criarFonteDados() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
fonteDados = new HikariDataSource(config);
}
@Bean
DataSource fonteDados() {
return fonteDados;
}
}
Alternativas para Inicialização Global
Para ações após inicialização total da aplicação:
@Component
@Order(1)
public class InicializacaoApp implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("Aplicação pronta");
}
}