Introduction to Spring profiles
So many men, so many minds. When we are implementing software for different customers we sometimes need to handle various requirements for the same project. For example Customer A needs SAML authentication and customer B needs LDAP authentication. With Spring Profiles (available from Spring 3.1) we are able to provide a way to segregate parts of our implemented application configuration. This blog will help us to make certain code or rather certain Spring beans only available for specific requirements. For example the example used in this blog can be used to activate the required authentication provider for the provider manager when using Spring Security. Profiles can be configured by annotations and/or by xml. Annotations @Component or @Configuration annotated beans can contain the annotation @Profile to only load them in a certain environment.
@Component
@Profile("ldap")
public class LDAPAuthentication {
public LDAPAuthentication() {
System.out.println("LDAP Authentication set by annotations");
}
}
@Component
@Profile("saml")
public class SAMLAuthentication {
public SAMLAuthentication() {
System.out.println("SAML Authentication set by annotations");
}
}
XML
Probably not used anymore in freshly started projects, but it is also possible to make certain Spring beans only available within your XML configuration.
<!--
We use the profile attribute on the beans element to specify the profile.
Only the child beans are loaded on initialization if the profile is active
-->
<beans profile="ldap">
<bean class="com.jdriven.blog.profiles.xml.LDAPAuthentication" />
</beans>
<beans profile="saml">
<bean class="com.jdriven.blog.profiles.xml.SAMLAuthentication" />
</beans>
Activate correct profile
Of course you are able to combine both configurations, but is should be obvious to choose one configuration to make your code more predictable . Just to show the possibilities we have combined them in one project.In a plain Java application the profiles can be setup by activating the profile in your application context.
public static void main(String[] args) {
//Create new context to show the XML Spring profile setup
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
//Setting 'ldap' as active profile
ctx.getEnvironment().setActiveProfiles("ldap");
//Load the app-context.xml from the root of the classpath
ctx.load("classpath:app-context.xml");
//We need to refresh the application because we added a resource
ctx.refresh();
//Closing the application context to release and destroy all resources and cached beans
ctx.close();
//Creating a new context to show the annotation Spring profile setup
AnnotationConfigApplicationContext actx = new AnnotationConfigApplicationContext();
//Setting 'saml' as active profile
actx.getEnvironment().setActiveProfiles("saml");
//Scan base package for annotations
actx.scan("com.jdriven.blog");
//We need to refresh the application because we added a scan
actx.refresh();
//Closing the application context to release and destroy all resources and cached beans
actx.close();
}
See the following github for the full source of this project: https://github.com/michelmeeuwissen/Spring-Profiles-Intro