In this article, we will discuss how to use Spring @Import annotation with examples.
Below diagram shows an internal implementation of @Import annotation:
If XML or other non-@Configuration bean definition resources need to be imported, use the @ImportResource annotation instead. For example, if you want to load config.properties file then you can use @ImportResource annotation to load respective property files.
In Spring XML-based configuration we use an <import> element to load multiple Spring bean configuration files.
Example:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="common/spring-common.xml"/> <import resource="dao/spring-dao.xml"/> <import resource="beans/spring-beans.xml"/> </beans>
Spring provides the alternative @Import annotation which allows for loading @Bean definitions from another configuration class.
@Configuration public class ConfigA { @Bean public A a() { return new A(); } } @Configuration @Import(ConfigA.class) public class ConfigB { @Bean public B b() { return new B(); } }
Now, rather than needing to specify both ConfigA class and ConfigB class when instantiating the context, only ConfigB needs to be supplied explicitly:
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class); // now both beans A and B will be available... A a = ctx.getBean(A.class); B b = ctx.getBean(B.class); }
@Import annotation also can be used to load @Bean's from multiple configuration class files.
@Configuration public class ConfigA { @Bean public A a() { return new A(); } } @Configuration public class ConfigB { @Bean public B b() { return new B(); } } @Configuration public class ConfigC { @Bean public C c() { return new C(); } } @Configuration @Import(value = {ConfigA.class, ConfigB.class, ConfigC.class}) public class ConfigD { @Bean public D d() { return new D(); } }