Spring @Configuration Annotation

Spring @Configuration annotation helps in creating Java based configuration in Spring rather than relying on XML based configuration. Any class annotated with @Configuration indicates that a class declares one or more @Bean methods that are processed by the Spring container to generate bean definitions and manage the overall bean lifecycle.

How to use @Configuration annotation in Spring

@Configuration
public class AppConfig {
  @Bean
  public MyBean myBean() {
    return new MyBean();
  }
}

Here AppConfig class is annotated with @Configuration indicating that it declares bean methods. In the class that method is myBean() annotated with @Bean annotation. Spring container creates and manages this bean instance.

How to bootstrap @Configuration classes

@Configuration classes are typically bootstrapped using either AnnotationConfigApplicationContext or its web-capable variant, AnnotationConfigWebApplicationContext.

If we take the Configuration as used above for AppConfig and try to bootstrap it then it can be done as given below-

public class App {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.register(AppConfig.class);
    ctx.refresh();
    MyBean myBean = ctx.getBean("myBean", MyBean.class);
    myBean.myMethod();
    ctx.close();
  }
}

MyBean.java

public class MyBean {
  public void myMethod() {
    System.out.println("In MyMethod of MyBean class");
  }
}

Spring @Configuration annotation example

Here is another example showing how to use @Configuration along with @Autowired and @Component annotations. This example shows the layered architecture having Service and DAO layers.

@Service
public class UserService {
	@Autowired
	UserDAO userDAO;

	public void getUsers() {
		userDAO.getUsers();
	}
}

UserDAO Interface

public interface UserDAO {
	public void getUsers();
}

UserDAOImpl.java

@Repository
public class UserDAOImpl implements UserDAO {
	public void getUsers() {
		System.out.println("In getUsers method, connect to DB and get data");
	}
}

Configuration class

Appconfig class is annotated with @Configuration indicating that it is the class providing bean configuration. There is also a @ComponentScan annotation with the package to scan for bean definitions. Because of component scanning classes annotated with @Repository, @Service, @Component are automatically registered as beans.

@Configuration
@ComponentScan(basePackages="com.knpcode")
public class AppConfig {

}

Now you can run the example using the following class.

public class App {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
		UserService userService = ctx.getBean("userService", UserService.class);
		userService.getUsers();
		ctx.close();
	}
}

Output

14:21:11.584 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'userDAO'
14:21:11.586 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
14:21:11.891 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor'
14:21:11.909 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'userService'
In getUsers method, connect to DB and get data

Related Posts

That’s all for the topic Spring @Configuration Annotation. If something is missing or you have something to share about the topic please write a comment.


You may also like

  • Java Collections Framework Tutorial
  • How to Sort ArrayList of Objects in Java
  • Multithreading in Java Tutorial
  • Java Program to Count The Frequency of Each Character in a String
  • Primitive Data Types in Java
  • NameNode, Secondary Namenode and Datanode in HDFS

    Leave a Reply

    Your email address will not be published. Required fields are marked *

    This site uses Akismet to reduce spam. Learn how your comment data is processed.