Uso da Anotação @PostConstruct no Spring Framework

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");
    }
}

Tags: JakartaEE SpringFramework inicialização javabeans CicloDeVida

Publicado em 8-4 00:19