From XML to Annotations — Transitioning to Modern Spring Configuration

Alexander Obregon
3 min readAug 25, 2023

--

Image Source

Introduction

The Spring framework has witnessed significant evolution since its inception. One notable change has been the move from XML-based configurations to annotation-driven configurations. This transition wasn’t just a mere change of syntax but a fundamental shift in how developers interact with the Spring container.

Why Transition?

Before we delve into the nitty-gritty, let’s understand why such a shift was needed:

  1. Convenience: While XML configurations provide a visual separation of concerns, they can be verbose. Annotations reduce this verbosity significantly.
  2. Maintainability: As applications grow, managing XML configurations can become cumbersome. Annotations, being co-located with code, make it easier to refactor and understand the context.
  3. Flexibility: Annotations can take advantage of Java’s type system, leading to more compile-time checks and fewer runtime errors.

XML-Based Configuration: A Recap

To appreciate the simplicity annotations bring, let’s reminisce about XML configurations. Here’s a typical Spring bean configuration:

<bean id="myService" class="com.example.MyServiceImpl">
<property name="dependency" ref="myDependency"/>
</bean>

<bean id="myDependency" class="com.example.MyDependency"/>

These configurations clearly define beans and their dependencies. However, imagine managing such entries for hundreds of beans; it can be overwhelming.

Annotations: The New Era

Enter annotations. Introduced in Java 5, they allow metadata to be added directly to the code. Spring quickly adopted them.

Core Annotations

@Component: Basic annotation to indicate a Spring-managed component. It’s a generic stereotype for any Spring-managed component.

@Component
public class MyService { ... }

@Service, @Repository, @Controller: Specializations of @Component for specific use-cases. Semantically they’re the same, but using them makes the code more readable and suited for aspect-oriented programming concerns.

Dependency Injection

@Autowired: Used for automatic dependency injection.

@Service
public class MyServiceImpl implements MyService {

@Autowired
private MyDependency myDependency;
}

No need for the <property> tag anymore!

Java-Based Configuration

@Configuration: Indicates that a class declares one or more @Bean methods.

@Bean: An annotation at the method level, indicating that a method produces a bean to be managed by the Spring container.

@Configuration
public class AppConfig {

@Bean
public MyService myService() {
return new MyServiceImpl(myDependency());
}

@Bean
public MyDependency myDependency() {
return new MyDependency();
}
}

This approach marries the best of both worlds: structured configuration with the power of Java.

Component Scanning

@ComponentScan: Tells Spring where to search for components and configurations. It’s a powerful tool to automate bean creation.

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

Property Sources

@PropertySource: Externalizes configuration to a property file.

@Configuration
@PropertySource("classpath:app.properties")
public class AppConfig {

@Value("${app.name}")
private String appName;
}

Making the Transition

For those with legacy XML configurations, a phased transition might be wise:

  1. Hybrid Configuration: Mix XML with annotations. In your XML configuration, use <context:component-scan/> to activate annotation-based configurations.
  2. Replace XML beans: Gradually replace XML bean definitions with their annotated counterparts.
  3. Java-based Configurations: Eventually, you can transition fully to Java-based configurations using @Configuration and @Bean annotations.

Benefits

Transitioning to annotation-driven configurations results in:

  1. Easier Navigation: Go directly to the bean’s source code from its declaration.
  2. Reduced Duplication: No need to specify bean properties in both code and XML.
  3. Enhanced Productivity: Spend less time managing XML and more time writing business logic.

Conclusion

Transitioning from XML-based to annotation-based Spring configuration is more than a cosmetic change. It’s a step towards more maintainable, concise, and intuitive code. While XML served its purpose in the early days of Spring, annotations and Java-based configurations are undoubtedly the present and future.

Remember: change is constant. As the Spring framework evolves, it’s beneficial for developers to adapt and leverage the modern capabilities it offers. Whether you’re starting a new project or maintaining a legacy application, consider the power and simplicity annotations bring to the table.

Spring Boot icon by Icons8

--

--

Alexander Obregon

Software Engineer, fervent coder & writer. Devoted to learning & assisting others. Connect on LinkedIn: https://www.linkedin.com/in/alexander-obregon-97849b229/