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.
Il existe trois types de DI au printemps. (P.23)
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;
}
}
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;
}
}
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;
}
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é. |
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)
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".
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.
@Component
public class UserServiceImpl implements UserService {
@PostConstruct
void pupulateCache() {
//Processus de génération de cache
}
}
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
}
}
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
[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