Spring Boot GenericApplicationContext
last modified July 28, 2023
Spring Boot GenericApplicationContext tutorial shows how to use the
GenericApplicationContext
in a Spring application. In the example,
we create a Spring Boot console application.
Spring is a popular Java application framework and Spring Boot is an evolution of Spring that helps create stand-alone, production-grade Spring based applications easily.
GenericApplicationContext
GenericApplicationContext
is an implementation of the
ApplicationContext
, which does not assume a specific bean
definition format; e.g. XML or annotations.
Spring Boot GenericApplicationContext example
In the following application we create a GenericApplicationContext
and register a new bean with the context's registerBean
method.
Later we retrieve the bean from the application context with getBean
.
plugins { id 'org.springframework.boot' version '3.1.1' id 'io.spring.dependency-management' version '1.1.0' id 'java' } group = 'com.zetcode' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() }
This is the Gradle build file. The spring-boot-starter
is a core
starter, including auto-configuration support, logging, and YAML. The
spring-boot-starter-test
adds testing support in Spring.
spring.main.banner-mode=off logging.level.root=ERROR logging.pattern.console=%d{dd-MM-yyyy HH:mm:ss} %magenta([%thread]) %highlight(%-5level) %logger.%M - %msg%n
The application.properties
is the main configuration file in Spring
Boot. We turn off the Spring banner, reduce the amount of logging to errors
only, and set the console logging pattern.
package com.zetcode.service; import java.time.Instant; public class TimeService { public Instant getNow() { return Instant.now(); } }
TimeService
contains a simple method which returns current date and
time. This service class is going to be registered in our generic application
context.
package com.zetcode; import com.zetcode.service.TimeService; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.support.GenericApplicationContext; @SpringBootApplication public class Application implements CommandLineRunner { private final GenericApplicationContext context; public Application(GenericApplicationContext context) { this.context = context; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) throws Exception { context.registerBean("com.zetcode.Service.TimeService", TimeService.class, TimeService::new); var timeService = (TimeService) context.getBean(TimeService.class); System.out.println(timeService.getNow()); context.registerShutdownHook(); } }
Application
is the entry point which sets up Spring Boot
application. The @SpringBootApplication
annotation enables
auto-configuration and component scanning. It is a convenience annotation
for @Configuration
, @EnableAutoConfiguration
,
and @ComponentScan
annotations.
private final GenericApplicationContext context; public Application(GenericApplicationContext context) { this.context = context; }
We inject the GenericApplicationContext
.
context.registerBean("com.zetcode.Service.TimeService", TimeService.class, TimeService::new);
A new TimeService
bean is registered with the
registerBean
method.
var timeService = (TimeService) context.getBean(TimeService.class);
We retrieve the bean with getBean
.
System.out.println(timeService.getNow());
Finally, we call the bean's getNow
method.
package com.zetcode; import com.zetcode.service.TimeService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.support.GenericApplicationContext; import java.time.Instant; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest public class ApplicationTests { @Autowired private GenericApplicationContext context; @Test public void testNow() { var timeService = (TimeService) context.getBean("com.zetcode.service.TimeService"); var now = timeService.getNow(); assertThat(now.isBefore(Instant.now())); } }
We have a simple test that uses the TimeService's
getNow
method.
var timeService = (TimeService) context.getBean("com.zetcode.service.TimeService");
This time we refer to the bean by its given name.
$ ./gradlew bootRun ... ... INFO Application MyApp
We run the application.
In this article we have shown how to use
GenericApplicationContext
in a Spring application.