Introduction
In this tutorial I will create examples on Spring @ConditionalOnResource
. The @ConditionalOnResource
annotation lets configuration be included only when a specific resource is present in the classpath. For example, the Log4j
class is only loaded if the log4j configuration file (log4j.properties) was found on the class-path. This way, you might create similar modules that are only loaded if their respective configuration files have been found on the class path.
Prerequisites
Java at least 8, Maven 3.6.3, Spring Boot 2.1.7 – 2.4.5
Project Setup
Create a maven based project in your favorite IDE or tool with the project name as spring-conditional-on-resource.
I will update the build file (pom.xml) as follows to include the spring boot dependencies.
<?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.roytuts</groupId>
<artifactId>spring-conditional-on-resource</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Log4j Class
Create a simple Log4j
class just to check whether it is loaded or not based on condition.
package com.roytuts.spring.conditional.on.resource;
public class Log4j {
}
Spring Config
Create below SpringConfig
class to load the Log4j
class conditionally.
So if log4j.properties file is found in the classpath then only Log4j
class will be loaded otherwise not.
package com.roytuts.spring.conditional.on.resource;
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnResource(resources = { "log4j.properties" })
class SpringConfig {
@Bean
public Log4j log4j() {
return new Log4j();
}
}
Main Class
Create main class to test the Spring Boot application for @ConditionalOnResource
.
package com.roytuts.spring.conditional.on.resource;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class SpringConditionalOnResourceApp implements CommandLineRunner {
@Autowired
private ApplicationContext applicationContext;
public static void main(String[] args) {
SpringApplication.run(SpringConditionalOnResourceApp.class, args);
}
@Override
public void run(String... args) throws Exception {
String[] beans = applicationContext.getBeanDefinitionNames();
Arrays.sort(beans);
boolean contains = Arrays.stream(beans).anyMatch("log4j"::equalsIgnoreCase);
if (contains) {
System.out.println("Log4j loaded");
} else {
System.out.println("Log4j not loaded");
}
}
}
Testing the Application
Now if you run the above main class, you will see below output:
Log4j not loaded
Now if you put the log4j.properties file under classpath directory src/main/resources then you will see below output, but it depends on you how you are going to configure the log4j config file.
Log4j loaded