Different Configuration approaches in Java

Isaac Tonyloi
2 min readApr 9, 2024

There are primarily three types of configuration approaches: XML-based configuration, Java-based configuration, and Annotation-based configuration. Let’s explore each of them with code examples:

1. XML-based Configuration:

XML-based configuration involves defining Spring beans and their dependencies in XML configuration files. These files typically have a .xml extension and contain bean definitions using XML tags.

Example:

Consider a simple XML configuration file defining a UserService bean:

<!-- applicationContext.xml -->
<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"><bean id="userService" class="com.example.UserService">
<constructor-arg ref="userRepository" />
</bean>
<bean id="userRepository" class="com.example.UserRepositoryImpl" />
</beans>

2. Java-based Configuration:

Java-based configuration allows you to define Spring beans and their dependencies using Java code. This approach uses annotations like @Configuration and @Bean to specify configurations.

Example:

Consider a Java-based configuration class defining the same UserService bean:

@Configuration
public class AppConfig {
@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
@Bean
public UserService userService() {
return new UserService(userRepository());
}
}

3. Annotation-based Configuration:

Annotation-based configuration leverages annotations to configure Spring beans and their dependencies. Annotations like @Component, @Service, @Repository, and @Autowired are commonly used for this approach.

Example:

Consider the following annotated classes:

@Repository
public class UserRepositoryImpl implements UserRepository {
// Implementation
}

@Service
public class UserService {
private final UserRepository userRepository;

@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// Methods
}

In this example, the @Repository annotation marks the UserRepositoryImpl class as a repository component, and the @Service annotation marks the UserService class as a service component. The @Autowired annotation is used for constructor injection in UserService.

Choosing the Right Configuration Approach:

  • XML-based Configuration: Suitable for projects with legacy codebases or when you prefer a centralized configuration.
  • Java-based Configuration: Provides type-safety, refactoring support, and better IDE integration. Preferred for new projects or when you prefer programmatic configuration.
  • Annotation-based Configuration: Offers simplicity and reduces boilerplate code. Suitable for smaller projects or when you prefer a more declarative approach.

Combination of Configuration Approaches:

You can also combine different configuration approaches within the same project based on your requirements. For example, you can use XML-based configuration for infrastructure-related beans and Java-based or annotation-based configuration for business logic beans.

--

--

Isaac Tonyloi

Software Engineer. Fascinated by Tech and Productivity. Writing mostly for myself, sharing some of it with you