[JAVA] Résumé de Spring Framework - À propos de DI

Lisez le livre [Spring Thorough Introduction to Java Application Development with Spring Framework](https://www.amazon.co.jp/Spring Thorough Introduction-Spring-Java Application Development with Framework-NTT Data Co., Ltd./dp/4798142476/) Et j'ai résumé les parties qui me paraissent importantes. (Je l'ai complété un peu indépendamment.) Le nombre de pages du livre de référence est indiqué afin que vous puissiez y revenir plus tard.

Cette fois, c'est un article sur DI.

Types d'injection

Il existe trois types de DI au printemps. (P.23)

Injection de poseur

Comment DI pour les arguments du setter.

Mérite: DI peut être effectué tout en conservant le Setter existant. Inconvénient: c'est plus gênant que l'injection sur le terrain.

@Component
public class UserServiceImpl implements UserService {
    private UserRepository userRepository;
    private PasswordEncoder passwordEncoder;
    
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    @Autowired
    public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }
}

Injection constructeur

Comment DI pour les arguments du constructeur.

Avantage: vous pouvez ajouter un modificateur final au champ pour le rendre immuable. Inconvénient: c'est plus gênant que l'injection sur le terrain.

@Component
public class UserServiceImpl implements UserService {
    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;
    
    @ConstructorProperties({"userRepository", "passwordEncoder"})
    public UserServiceImpl(UserRepository userRepository, PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }
}

Injection sur le terrain

Comment DI pour un champ dans une classe.

Mérite: La quantité de code est faible et c'est le plus simple à écrire. Inconvénient: le code est censé faire la DI.

@Component
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private PasswordEncoder passwordEncoder;
}

Cible de l'analyse des composants

L'analyse des composants consiste à analyser le chargeur de classe et à enregistrer automatiquement une classe spécifique dans le conteneur DI. (P.35)

Par défaut, les classes avec les annotations suivantes sont ciblées.

Annotation La description
@Controller Un composant qui joue le rôle de C dans le modèle MVC. Le composant auquel cette annotation est attachée traite la demande / réponse du client.
@Service Une annotation qui indique qu'il s'agit d'un composant qui implémente la logique métier.
@Repository Un composant qui fournit un traitement lié à la persistance des données. Mettre en œuvre le traitement CRUD des données à l'aide d'ORM, etc.
@Component Composants qui ne s'appliquent pas aux trois ci-dessus. Donner à la classe utilitaire, etc.
@Configuration Écrivez avant la déclaration de classe. Cette annotation indique que cette classe est responsable de la définition du bean. Attachez toujours ceci à la classe de configuration Bean.
@RestController Donnez au contrôleur pour l'API Web qui renvoie JSON, XML, etc.
@ControllerAdvice Lors de la gestion des exceptions entre les contrôleurs, ajoutez cette annotation à la classe pour la gestion des exceptions. Utilisé pour la classe ExceptionHandler.
@ManagedBean À l'origine, il représente un bean géré géré par JSF. Printemps@Cela semble avoir la même signification que lorsque le composant est attaché.
@Named À l'origine Java(EE)Il représente la cible d'injection dans le système. Printemps@Cela semble avoir la même signification que lorsque le composant est attaché.

Portée Bean

Dans Spring, le composant enregistré dans le conteneur DI est appelé ** "Bean" **, et la configuration est appelée "Bean definition". Obtenir un bean à partir d'un conteneur DI est appelé "recherche". (P.17)

Scopes disponibles dans Spring Framework

Une liste des spécifications de portée disponible dans Spring. (P.39)

portée La description
singleton
(Défaut)
Une instance de bean est créée au démarrage du conteneur DI, et la même instance est partagée et utilisée. Si la portée n'est pas définie, elle est traitée comme une seule tonne.
prototype Créez une instance chaque fois qu'un bean est acquis. Pour les beans thread-unsafe, utilisez prototype car la portée singleton ne peut pas être utilisée.
session Créez une instance de bean pour chaque session HTTP. Valable uniquement pour les applications Web.
request Créez une instance de bean pour chaque requête HTTP. Valable uniquement pour les applications Web.
globalSession Créez une instance pour chaque session globale dans l'environnement de portlet. Valide uniquement pour les applications Web prenant en charge les portlets.
application Créez une instance de bean pour chaque contexte de servlet. Valable uniquement pour les applications Web.
Portée personnalisée(Dénomination unique) Créez une instance de bean avec vos propres règles définies.

Soyez prudent lorsque vous injectez différents scopes dans la même classe. (P.41)

Vous pouvez imaginer le type de site d'une application Web prenant en charge les portlets en recherchant des images sur "Portlet Web".

Cycle de vie du haricot

Le cycle de vie d'un grain géré par un conteneur DI comprend les trois phases suivantes. (P.47)

Parmi les trois phases ci-dessus, la plupart du temps est la phase d'utilisation.

Phase d'initialisation

  1. Lisez Bean → Préparez-vous à générer Bean.
  2. Résolution des dépendances → Génération d'instance Bean et exécution d'injection.
  3. Post-construction → Traitement après instanciation. Vous pouvez utiliser le haricot injecté.
@Component
public class UserServiceImpl implements UserService {
    @PostConstruct
    void pupulateCache() {
        //Processus de génération de cache
    }
}

Phase de fin

Dans la phase finale, un processus de pré-destruction appelé "Pre Destroy" est exécuté. (P.50)

@Component
public class UserServiceImpl implements UserService {
    @PreDestroy
    void clearCache() {
        //Processus de suppression du cache
    }
}

Source de référence

site

Implémentation de DI par annotation (2/5): Introduction à Spring Framework pour les débutants Diverses valeurs de retour dans le contrôleur Spring MVC --Qiita Gestion exceptionnelle dans Spring-Qiita Engineer's time kill: gérer les beans gérés au printemps avec Spring + JSF

Livres

[Présentation approfondie du développement d'applications Spring Java à l'aide de Spring Framework](https://www.amazon.co.jp/Thorough introduction au développement d'applications Spring-Java à l'aide de Spring-Framework-NTT Data Co., Ltd./dp/4798142476/)

Recommended Posts

Résumé de Spring Framework - À propos de DI
[Java] Spring DI ③
Notes de l'étude Spring Framework [Partie 1] Conteneur DI
[Spring Framework] Division de la configuration
Prise en charge multilingue de Spring Framework
1. Démarrez Spring Framework à partir de 1
À propos de DI of Spring ①
Première botte à ressort (DI)
À propos de DI of Spring ②
Modifications majeures liées au conteneur Spring Framework 5.0 DI
Les bases du printemps ~ Édition DI ~
Série de mémos d'auto-apprentissage Spring Framework_1
À propos de l'erreur de contexte Spring Framework
Introduction à Spring Boot ① ~ DI ~
[Java] Fonctionnement de Spring DI
À propos des annotations liées à Spring DI
Spring Framework 5.0 Résumé des principaux changements
cadre de printemps Mémo d'étude simple (2): AOP
Outils Spring Framework pour développeur Java
[Java] Spring DI ④ --Gestion du cycle de vie
Contrôleur de cadre de test Spring avec Junit
Introduction de l'authentification de base à Heroku [Spring Framework]
Modifications majeures liées au test Spring Framework 5.0
XML de définition de bean Spring Framework: balise personnalisée
Pourquoi le printemps est considéré comme un cadre léger
À propos de l'affichage initial de Spring Framework
Changements majeurs dans la fonctionnalité de base de Spring Framework 5.0
Fonctionnalités du framework Spring pour les développeurs Java
DI SessionScope Bean dans le filtre Spring Boot 2