L'Inversion de Contrôle (IoC) est un prinicpe de conception où la gestion du cycle de vie des objets est déléguée à un conteneur, tel que Spring, plutôt que d'être gérée directement dans le code. Cela favorise le découplage et améliore la testabilité des applications.
L'Injection de Dépendances (DI) est une technique concrète d'implémentation de l'IoC, consistant à fournir les dépendances d'un objet via des paramètres externes, évitant ainsi les instanciations internes rigides.
Mise en œuvre pratique avec Java et Spring
Préparation de l'environnement
Créez un projet Maven et structurez les packages de manière logique, par exemple :
com
└── example
├── repository
│ └── UserRepository.java
│ └── UserRepositoryImpl.java
└── service
└── UserService.java
└── UserServiceImpl.java
Ajoutez les dépendances Spring dans le fichier pom.xml :
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Définition des interfaces et des classes
Créez une interface UserRepository et son implémentation :
// Interface Repository
public interface UserRepository {
void authenticate();
}
// Implémentation Repository
public class UserRepositoryImpl implements UserRepository {
@Override
public void authenticate() {
System.out.println("Authentification réussie via UserRepositoryImpl.");
}
}
Définissez ensuite l'interface UserService avec une injection de dépendance :
// Interface Service
public interface UserService {
void login();
}
// Implémentation Service avec DI
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public void login() {
System.out.println("Exécution du service de login.");
userRepository.authenticate();
}
}
Configuraton des beans Spring
Créez un fichier spring-config.xml pour configurer les beans :
<?xml version="1.0" encoding="UTF-8"?>
<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="userRepo" class="com.example.repository.UserRepositoryImpl"/>
<bean id="userService" class="com.example.service.UserServiceImpl">
<property name="userRepository" ref="userRepo"/>
</bean>
</beans>
Test de l'application
Écrivez une classe de test pour valider l'IoC et le DI :
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserService service = (UserService) context.getBean("userService");
service.login();
}
}
Pour simplifier, l'utilisation d'annotations comme @Autowired ou @Resource peut automatiser l'injection, réduisant le code manuel de configuration.