Tuesday, 6 June 2023

Micronaut: @PostConstruct: Execute the code post dependency injection

@PostConstruct annotation is applied on a method that needs to be executed after dependency injection is done to perform any initialization. This  method must be invoked before the class is put into service. This annotation is supported on all classes that support dependency injection.

 

Example

@Singleton
public class AppConfig {

    @Inject
    EmbeddedServer embeddedServer;

    @PostConstruct
    public void postConstructMethod() {
        System.out.println("host : " + embeddedServer.getHost());
        System.out.println("port : " + embeddedServer.getPort());
    }
    
    public void sayHi() {
        System.out.println("Hi!!!!!!!!!!!");
    }
}

 

Find the below working application.

 

Step 1: Create new maven project ‘micronaut-rest-postconstruct’.

 

Step 2: Update pom.xml with maven dependencies.

 

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample.app</groupId>
    <artifactId>micronaut-rest-postconstruct</artifactId>
    <version>0.1</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>io.micronaut</groupId>
        <artifactId>micronaut-parent</artifactId>
        <version>3.7.4</version>
    </parent>

    <properties>
        <packaging>jar</packaging>
        <jdk.version>11</jdk.version>
        <release.version>11</release.version>
        <micronaut.version>3.7.3</micronaut.version>
        <micronaut.runtime>netty</micronaut.runtime>
        <exec.mainClass>com.sample.app.App</exec.mainClass>
    </properties>

    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo.maven.apache.org/maven2</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-inject</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-validation</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-client</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-server-netty</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-jackson-databind</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.test</groupId>
            <artifactId>micronaut-test-junit5</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>io.micronaut.build</groupId>
                <artifactId>micronaut-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <!-- Uncomment to enable incremental compilation -->
                    <!-- <useIncrementalCompilation>false</useIncrementalCompilation> -->

                    <annotationProcessorPaths
                        combine.children="append">
                        <path>
                            <groupId>io.micronaut</groupId>
                            <artifactId>micronaut-http-validation</artifactId>
                            <version>${micronaut.version}</version>
                        </path>
                    </annotationProcessorPaths>

                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Step 3: Define AppConfig class.

 

AppConfig.java

package com.sample.app.config;

import io.micronaut.runtime.server.EmbeddedServer;
import jakarta.annotation.PostConstruct;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

@Singleton
public class AppConfig {

    @Inject
    EmbeddedServer embeddedServer;

    @PostConstruct
    public void postConstructMethod() {
        System.out.println("host : " + embeddedServer.getHost());
        System.out.println("port : " + embeddedServer.getPort());
    }
    
    public void sayHi() {
        System.out.println("Hi!!!!!!!!!!!");
    }
}

Step 4: Define WelcomeController class.

 

WelcomeController.java

package com.sample.app.controller;

import com.sample.app.config.AppConfig;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import jakarta.inject.Inject;

@Controller("/welcome")
public class WelcomeController {

    @Inject
    private AppConfig appConfig;
    
    @Get(produces = MediaType.TEXT_PLAIN)
    public String index() {
        return "Welcome to Micronaut app!!!!";
    }
}

Step 4: Define main application class.

 

App.java

package com.sample.app;

import io.micronaut.runtime.Micronaut;

public class App {

    public static void main(String[] args) {
        Micronaut.run(App.class);
        
        // Use this if you want the beans to be initialized eagerly
        /*Micronaut.build(args)
        .eagerInitSingletons(true) 
        .mainClass(App.class)
        .start();*/
    }
}

Total project structure looks like below.




Build the project using mvn package command.

Navigate to the folder where pom.xml is located and execute the command ‘mvn package’.

 

Upon command successful execution, you can see the jar file ‘micronaut-rest-postconstruct-0.1.jar’ in project target folder.

$ls ./target 
classes
generated-sources
generated-test-sources
maven-archiver
maven-status
micronaut-rest-postconstruct-0.1.jar
original-micronaut-rest-postconstruct-0.1.jar
test-classes

Execute below command to run the application.

java -jar ./target/micronaut-rest-postconstruct-0.1.jar

When you start the application, you won't see the messages of PostConstruct method to standard out because the service bean are initialized eagerly by default. Send a request to http://localhost:8080/welcome and then you will see the below messages printed to stdout.

host : localhost
port : 8080

You can download this application from this link.


 

Previous                                                    Next                                                    Home

No comments:

Post a Comment