Spring AnnotationConfigApplicationContext
last modified October 18, 2023
Spring AnnotationConfigApplicationContext tutorial shows how to use AnnotationConfigApplicationContext in a Spring application.
Spring is a popular Java application framework.
AnnotationConfigApplicationContext
AnnotationConfigApplicationContext
is a standalone application context which
accepts annotated classes as input. For instance, @Configuration
or @Component
.
Beans can be looked up with scan
or registered with register
.
Spring AnnotationConfigApplicationContext example
The following example uses AnnotationConfigApplicationContext
to build
a standalone Spring application. It has one Spring bean--DateTimeService
--, which
is located with scan
.
pom.mxl src ├───main │ ├───java │ │ └───com │ │ └───zetcode │ │ │ Application.java │ │ └───bean │ │ DateTimeService.java │ └───resources │ logback.xml └───test └───java
This is the project structure.
<?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.zetcode</groupId> <artifactId>annotappctx</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <spring-version>5.3.23</spring-version> </properties> <dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring-version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <configuration> <mainClass>com.zetcode.Application</mainClass> </configuration> </plugin> </plugins> </build> </project>
This is the Maven build file for our Spring application.
<?xml version="1.0" encoding="UTF-8"?> <configuration> <logger name="org.springframework" level="ERROR"/> <logger name="com.zetcode" level="INFO"/> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n </Pattern> </encoder> </appender> <root> <level value="INFO" /> <appender-ref ref="consoleAppender" /> </root> </configuration>
This is the Logback configuration file.
package com.zetcode.bean; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @Service public class DateTimeService { public LocalDate getDate() { return LocalDate.now(); } public LocalTime getTime() { return LocalTime.now(); } public LocalDateTime getDateTime() { return LocalDateTime.now(); } }
The DateTimeService
is a service class that provides data and time
services. It is decorated with @Service
stereotype, which causes it to
be detected by the scanning process.
package com.zetcode; import com.zetcode.bean.DateTimeService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.stereotype.Component; @Component public class Application { private static final Logger logger = LoggerFactory.getLogger(Application.class); @Autowired private DateTimeService dateTimeService; public static void main(String[] args) { var ctx = new AnnotationConfigApplicationContext(); ctx.scan("com.zetcode"); ctx.refresh(); var bean = ctx.getBean(Application.class); bean.run(); ctx.close(); } public void run() { logger.info("Current time: {}", dateTimeService.getTime()); logger.info("Current date: {}", dateTimeService.getDate()); logger.info("Current datetime: {}", dateTimeService.getDateTime()); } }
We set up the application and inject the DateTimeService
. We call
all three service methods.
@Component public class Application {
The Application
is also decorated with a stereotype, this time @Component
.
It will also be detected by Spring. We need to call its run
method to go
outside the static context.
@Autowired private DateTimeService dateTimeService;
The service class is injected with @Autowired
.
var ctx = new AnnotationConfigApplicationContext(); ctx.scan("com.zetcode"); ctx.refresh();
A new AnnotationConfigApplicationContext
is created. The scan
method scans the com.zetcode
package and its subpackages for annotated classes
to generate beans. We need to call the refresh
method to finish the process.
public void run() { logger.info("Current time: {}", dateTimeService.getTime()); logger.info("Current date: {}", dateTimeService.getDate()); logger.info("Current datetime: {}", dateTimeService.getDateTime()); }
We get the current date, time, and datetime.
$ mvn package $ mvn -q exec:java 19:25:12.842 INFO com.zetcode.Application - Current time: 19:25:12.842639200 19:25:12.842 INFO com.zetcode.Application - Current date: 2019-01-05 19:25:12.842 INFO com.zetcode.Application - Current datetime: 2019-01-05T19:25:12.842639200
We run the application.
In this article we have used AnnotationConfigApplicationContext
to create a new standalone Spring application.
Author
List all Spring tutorials.