

Table of Contents
1. Overview
Spring framework makes our very easy work to creating beans and accessing those beans in teams of scopes as well. But so many times we need to create beans based on some conditions like properties values and resources which are available on the classpath and etc. In this article, we are going to discuss to create conditional beans if particular resource available in the classpath. Resources might be any resources like text file, properties file, XML file, and any other configuration file.
i.e Spring internally use these configurations at so many places, for example, if logback.xml file available in classpath then spring will use logback logs configuration otherwise it will use default log configurations.
2. Spring ConditionalOnResource Example
@ConditionalOnResourceis annotation using that we can create a bean if specified resource found otherwise it will not create a bean. We can specify resources location of classpath as well as system locations like:@ConditionalOnResource(resources = "file:\\C:\\data\\example.json"). Make sure that, If we want to point to file system instead of classpath then resources name should start withfile:\\.@ConditionalOnResourceannotation also supports condition on multiple resouces, It will create bean only if all the resources must exist at specified locations:@ConditionalOnResource(resources = {"classpath:example.json","classpath:example1.json"})
- Here
@ConditionalOnResource(resources = "classpath:example.json")indicates that create the bean if indicated file found in classpath otherwise bean will not be created. @ConditionalOnMissingBeanindicates that example.json not found in class so above bean will not be created in that case default bean forExampleServicewill be created with a default value. It’s not compulsory to write@ConditionalOnMissingBeanconfigurations but we do not have invert condition of@ConditionalOnResourcein spring.
package com.javadeveloperzone;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* Created by JavaDeveloperZone on 06-16-2019.
*/
@SpringBootApplication
public class SpringBootConfig implements CommandLineRunner{
@Autowired
private ExampleService exampleService;
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(SpringBootConfig.class);
springApplication.run(args);
}
@ConditionalOnResource(resources = "classpath:example.json")
@Bean
ExampleService exampleService() throws Exception{
System.out.println("Creating bean of example json from example.json...");
File file=new ClassPathResource("example.json", this.getClass().getClassLoader()).getFile();
return new ExampleService(new String(Files.readAllBytes(Paths.get(file.toURI()))));
}
@ConditionalOnMissingBean
@Bean
ExampleService exampleServiceNo() throws Exception{
System.out.println("ExampleService bean not found so creating default bean");
return new ExampleService("{name:developer}"); // default value
}
@Override
public void run(String... args) {
System.out.print(exampleService.getJson()); // it will print value
}
}3. Conclusion
In this article, We learn about how we can create beans with @ConditionalOnResource annotation and based on the particular condition of resources, resources files might be inside the classpath or as a file system resources. We have also seen an example where spring internally used @ConditionalOnResource annotation. @ConditionalOnMissingBean annotation is used to create bean is it does not exist in spring content.
