Explorez le framework Java le plus populaire, comprenez ses mécanismes internes et passez du niveau débutant au niveau compétent.
⚡ Technologie | Pourquoi | Comme une star ? Contactez-moi |
⚡Technologie
Introduction
Bonjour à tous, je m'appelle Lex ?. Je suis un développeur back-end Java avec 8 ans d'expérience et un programmeur passionné par le framework Spring❤️. Afin d'aider les programmeurs qui souhaitent en savoir plus sur le framework Spring, j'ai créé cette "Série de lecture de code source Spring". À travers cette série, j'espère explorer avec vous le fonctionnement interne de Spring. Si vous avez le même intérêt ou les mêmes questions, contactez-moi !
? Pourquoi faire une analyse du code source Spring ?
Dans mon travail de développeur travaillant sur des frameworks, je rencontre souvent des situations où je dois comprendre et ajuster en profondeur le comportement du framework. Ces tâches ne consistent pas seulement à utiliser l’API du framework, mais nécessitent également une compréhension détaillée du fonctionnement interne du framework. Bien qu'il existe des versions simplifiées de Spring sur Github, qui sont effectivement très utiles pour démarrer, lorsqu'il s'agit d'applications de projet réelles, elles sont encore très différentes du véritable framework Spring. Par conséquent, j'ai commencé à étudier le code source de Spring en profondeur, dans l'espoir de mieux comprendre son mécanisme de fonctionnement interne afin de mieux l'appliquer à mon travail réel. Partager mon analyse de code source, c'est aussi fournir des références et de l'aide aux développeurs qui souhaitent vraiment comprendre Spring, pas seulement l'utiliser.
Donne-moi juste une étoile
Chers amis, j'ai vraiment passé beaucoup de temps à rechercher et à organiser cette "Série de lecture de code source Spring". Si vous pensez que cette chose n'est pas mauvaise ou qu'elle vous a apporté un peu d'aide, cliquez sur l'étoile. Cela signifie vraiment beaucoup pour moi, et chaque étoile me donne le sentiment que tout le travail acharné en vaut la peine. Je sais que c'est une petite chose, mais votre clic est pour moi le meilleur encouragement. Quoi qu'il en soit, merci d'avoir pris le temps de lire mon contenu, je l'apprécie vraiment !
?Série de lecture de code source Spring
Noyau de ressort
Chargement et accès aux ressources
Ressource : interface abstraite, représentant des fichiers, des chemins de classes, etc., utilisée pour accéder à des ressources provenant de différentes sources.
ResourceLoader : l'interface principale pour l'acquisition de ressources, qui met en œuvre la stratégie de chargement uniforme des ressources à partir de différents emplacements.
ResourcePatternResolver : interface de résolution de modèles de ressources, utilisée pour charger de manière flexible plusieurs ressources dans les applications.
DocumentLoader : interface principale de chargement et d'analyse de documents XML, prenant en charge la configuration automatique des applications Spring en arrière-plan.
Métadonnées et filtrage
MetadataReader : le cœur de l'acquisition de métadonnées de classe, prenant en charge des fonctions avancées telles que l'analyse des composants, les annotations conditionnelles et l'AOP.
AnnotationMetadata : obtenez et exploitez dynamiquement les informations d'annotation de classe d'exécution.
TypeFilter : personnalisez le filtrage des classes lors de l'analyse des composants, en prenant en charge des conditions complexes et un filtrage précis.
Condition : jugement conditionnel, un mécanisme flexible qui détermine la création et la configuration du Bean.
Validation, liaison de données et conversion de type
Validateur : fournit une logique de validation des données personnalisée pour garantir que les objets du modèle respectent les règles métier.
PropertyEditor : personnalisez la logique de conversion des propriétés JavaBean et gérez la conversion des types de propriétés.
Convertisseur : utilisé pour la conversion entre différents types, définissant des règles simples de conversion de type source vers type cible.
ConverterFactory : crée un convertisseur pour un type de source spécifique pour la conversion de type.
GenericConverter : un convertisseur plus complexe qui prend en charge plusieurs conversions de types source et cible.
ConditionalConverter : un convertisseur qui choisit d'effectuer ou non une conversion en fonction de conditions.
ConversionService : fournit une interface de service de conversion de type unifiée et gère les convertisseurs.
Imprimante : utilisée pour formater des objets en texte, en se concentrant sur la sortie formatée.
Analyseur : utilisé pour analyser du texte en objets, en se concentrant sur la logique d'analyse.
Langage d'expression de printemps (SpEL)
ExpressionParser : analyse une expression SpEL sous forme de chaîne, crée et renvoie une instance d'expression.
Expression : fonction d'évaluation des chaînes d'expression, prenant en charge des opérations telles que la conversion de type et l'obtention de chaînes originales.
EvaluationContext : gère les informations contextuelles des expressions SpEL.
PropertyAccessor : utilisé pour lire et écrire les propriétés des objets et peut être utilisé pour implémenter une logique d'accès aux propriétés personnalisée.
ConstructorResolver : analyse le constructeur pour déterminer comment le bean est instancié.
MethodResolver : résolvez les méthodes de classe pour garantir des appels corrects, gérer la surcharge et la correspondance des paramètres.
BeanResolver : analyse la définition du bean, y compris les dépendances, les paramètres de propriété, l'instanciation et le retour.
TypeLocator : recherche dynamiquement les classes et renvoie les objets Class, utilisés dans l'analyse des expressions, la conversion de type, etc.
TypeConverter : fonction de conversion de type qui convertit les données d'une expression d'un type à un autre.
TypeComparator : fonction de comparaison de types, qui définit une méthode pour comparer si deux objets sont égaux.
OperatorOverloader : fonction de surcharge d’opérateurs, une méthode de personnalisation des opérateurs dans les expressions.
Définition et enregistrement du bean
BeanDefinition : décrivez Bean en détail et prenez en charge les fonctions de base telles que l'injection de dépendances, l'AOP et le contrôle de la portée.
BeanDefinitionHolder : la classe clé pour gérer et exploiter BeanDefinition.
BeanDefinitionRegistry : interface clé de gestion de l'enregistrement des définitions du bean, traitement des métadonnées du bean.
Lecture et analyse de la définition du bean
XmlBeanDefinitionReader : chargez et analysez la configuration XML, créez un conteneur IOC et enregistrez la définition du Bean.
PropertiesBeanDefinitionReader : le fichier de propriétés est chargé et analysé dans la définition du Bean.
GroovyBeanDefinitionReader : les scripts Groovy sont analysés dans les définitions de Bean.
AnnotatedBeanDefinitionReader : configuration des annotations, analyse et enregistre automatiquement les composants Spring et simplifie la configuration de la définition du Bean.
ClassPathBeanDefinitionScanner : l'analyse du chemin de classe enregistre les Spring Beans, prenant en charge l'assemblage automatique.
Usine de haricots
BeanFactory : l'interface principale de Spring, fournissant des fonctions de base pour la configuration, la création et la gestion de Bean.
ListableBeanFactory : prend en charge l'obtention d'une collection de beans par type.
HierarchicalBeanFactory : prend en charge la relation de conteneur parent-enfant et implémente la structure hiérarchique de la définition du Bean.
ConfigurableBeanFactory : fournit des extensions à la configuration de BeanFactory, telles qu'un éditeur de propriétés, une portée, etc.
AutowireCapableBeanFactory : interface fonctionnelle de base pour la création, l'initialisation, l'injection et la destruction de Bean.
ConfigurableListableBeanFactory : interface d'usine de Bean configurable qui prend en charge les opérations de configuration et de liste.
contexte du conteneur
ClassPathXmlApplicationContext : contexte dans lequel le chemin de classe charge le fichier de configuration XML.
AnnotationConfigApplicationContext : contexte de chargement des informations de configuration dans la classe de configuration d'annotation.
GenericApplicationContext : prend en charge plusieurs méthodes de configuration, XML, annotations et contextes enregistrés manuellement.
Importation et combinaison de définitions de beans
ImportBeanDefinitionRegistrar : enregistrez dynamiquement les beans au moment de l'exécution pour obtenir une configuration flexible et étendre les fonctions de la classe de configuration.
ImportSelector : importez dynamiquement des classes de configuration au moment de l'exécution pour obtenir une sélection conditionnelle et une configuration flexible.
DeferredImportSelector : importez dynamiquement la configuration au moment de l'exécution, prenant en charge la sélection conditionnelle et le chargement différé par groupe.
Cycle de vie du haricot
Processus d'enregistrement des définitions de Bean : chargement et analyse des fichiers de configuration, enregistrement et analyse des définitions de Bean, des noms de classe, des portées, des attributs, etc.
Processus d'initialisation du bean : instanciation, injection de propriétés, rappel Aware, post-processeur, appel de méthode d'initialisation.
Processus de résolution des dépendances de Bean : déclarer les dépendances, rechercher des dépendances, injecter des dépendances, gérer les dépendances circulaires et retarder la résolution des dépendances.
Processus de destruction du bean : appel de méthode de destruction, rappel d'interface, nettoyage post-traitement, déclenchement de notifications, recyclage des ressources GC.
Analyse des propriétés et configuration de l'environnement
PropertySource : une classe abstraite qui gère diverses sources de configuration et prend en charge le chargement et l'accès flexibles aux configurations d'application.
PropertySources : utilisé pour gérer et accéder uniformément à plusieurs instances PropertySource, simplifiant ainsi le traitement des données de configuration.
PropertyResolver : analyse universelle des propriétés, obtention des valeurs de configuration, gestion des propriétés manquantes, simple et flexible.
ConfigurablePropertyResolver : configuration de l'analyse des propriétés et paramètres d'espace réservé pour s'adapter aux différents besoins de configuration.
Environnement : représentation de l'environnement d'application, fournissant un accès aux attributs, prenant en charge les fichiers de configuration et réalisant une configuration dynamique.
ConfigurableEnvironment : configurez dynamiquement l'environnement de l'application, activez la configuration par défaut et améliorez la flexibilité de l'application.
Points d'initialisation et d'extension du bean
InitializingBean : fournit une interface pour exécuter une logique personnalisée lors de l'initialisation du Bean.
JetableBean : définit l'interface permettant d'effectuer des opérations de nettoyage avant la destruction du Bean.
BeanDefinitionRegistryPostProcessor : modifiez ou ajoutez dynamiquement BeanDefinition au démarrage du conteneur.
BeanFactoryPostProcessor : modifiez ou configurez globalement BeanFactory avant d'instancier le Bean.
BeanPostProcessor : effectuez un traitement personnalisé avant et après l'initialisation du Bean, qui peut affecter tous les Beans.
InstantiationAwareBeanPostProcessor : fournit un contrôle plus approfondi de l'instanciation et de l'injection de propriétés.
DestructionAwareBeanPostProcessor : permet des opérations de nettoyage supplémentaires avant la destruction du Bean.
MergedBeanDefinitionPostProcessor : traite BeanDefinition lors de la fusion des définitions de Bean.
SmartInstantiationAwareBeanPostProcessor : fournit un contrôle d'instanciation plus intelligent.
SmartInitializingSingleton : exécute une logique personnalisée une fois que tous les beans singleton sont initialisés.
Série d'interfaces conscientes
BeanNameAware : laissez le Bean obtenir son propre nom dans le conteneur.
BeanClassLoaderAware : Permet à un bean d'obtenir son chargeur de classe.
BeanFactoryAware : fournit au Bean pour obtenir le BeanFactory auquel il appartient.
EnvironmentAware : permet aux beans d'obtenir la configuration de l'environnement d'application.
EmbeddedValueResolverAware : permet aux beans de résoudre les espaces réservés de valeur intégrée.
ResourceLoaderAware : permet aux beans d'obtenir des chargeurs de ressources.
ApplicationEventPublisherAware : permet au bean de publier des événements d'application.
MessageSourceAware : permet au Bean d'obtenir la source du message.
ApplicationContextAware : permet aux beans d'obtenir le contexte de l'application.
ImportAware : permet à une classe de configuration importée d'obtenir des informations sur la classe qui l'a importée.
Annotations principales
@Configuration : déclarez la classe comme classe de configuration et définissez les dépendances entre les beans et les beans.
@ComponentScan : permet à l'analyse des composants de découvrir et d'enregistrer automatiquement les classes marquées comme composants.
@Bean : déclarez une méthode dans la classe de configuration et renvoyez une instance de Bean.
@Import : introduisez d'autres classes de configuration et fusionnez leurs définitions de Bean dans le conteneur actuel.
@PropertySource : spécifiez le fichier de propriétés et chargez la configuration externe dans l'environnement.
@DependsOn : spécifiez l'ordre de dépendance des beans pour garantir que des beans spécifiques sont initialisés avant les autres beans.
@Conditional : Déterminez s'il faut créer un bean en fonction des conditions.
@Lazy : Spécifie l'initialisation paresseuse du bean, qui n'est créée que lors de sa première utilisation.
@Value : injectez une valeur ou une expression simple dans le paramètre de champ ou de méthode d'un Bean.
@Autowired : assemblez automatiquement les dépendances du Bean.
@Primary : Spécifie le bean préféré à sélectionner en premier parmi plusieurs beans candidats.
@Description : fournissez des informations descriptives sur le bean.
@Role : fournit des indications de rôle pour les beans afin de distinguer les beans de types similaires.
@Indexed : marque le bean pour l'indexation.
@Order : Spécifiez l'ordre de chargement des beans.
Spécification JSR
@Inject : annotation d'injection de dépendances standard JSR-330.
@Named : annotation de dénomination standard JSR-330.
@Resource : annotation d'injection de ressources standard Java EE.
@Qualifier : utilisé pour qualifier les beans injectés.
@Scope : Spécifie la portée du Bean.
@Singleton : spécifiez le Bean comme singleton.
@PostConstruct : spécifiez la méthode d'initialisation.
@PreDestroy : spécifiez la méthode de destruction.
Fournisseur : une interface d'usine Bean commune fournie par la bibliothèque standard Java.
AOP du printemps
Proxy dynamique JDK : implémentation d'interface, génération dynamique de classes proxy, appels de méthodes de traitement et préoccupations transversales unifiées.
Proxy dynamique Cglib : Une bibliothèque basée sur la génération de bytecode, aucune interface n'est requise, et elle peut intercepter les méthodes de classe et les améliorer.
ClassFilter : détermine si la classe correspond à la condition d'interception.
MethodMatcher : Déterminez si la méthode correspond à la condition d'interception.
Pointcut : définissez le point d'entrée et faites correspondre la méthode interceptée.
Conseil : L'interface principale d'AOP qui définit divers comportements de type de notification.
MethodInterceptor : intercepte l'exécution de la méthode, permettant d'ajouter une logique supplémentaire avant et après.
MethodBeforeAdvice : permet d'insérer une logique personnalisée avant les appels de méthode.
AfterReturningAdvice : permet d'insérer une logique personnalisée après un appel de méthode. <
ThrowsAdvice : notification d'exception, capture les exceptions levées par les méthodes et exécute une logique supplémentaire.
IntroductionIntercepteur : introduit dynamiquement de nouvelles fonctionnalités ou propriétés à l'objet cible.
Conseiller : utilisé pour combiner les notifications et les pointscuts afin de prendre en compte les préoccupations transversales dans la programmation des aspects.
Conseillé : Configurez les notifications, notificateurs, cibles, etc. de l'agent AOP.
ProxyFactory : Un moyen pratique de créer des objets proxy.
AopProxyFactory : créez une usine de proxy AOP, prenant en charge JDK et CGLIB.
AopProxy : créez et gérez des objets proxy AOP.
AdvisorChainFactory : interface d'usine pour créer une chaîne Advisor.
AdvisorAdapterRegistry : adaptez divers conseils aux intercepteurs AOP, enregistrez et gérez les adaptateurs Advisor.
AdvisorAdapter : adaptez différents types de notifications aux chaînes d'intercepteurs.
ProxyMethodInvocation : proxy d'invocation de méthode AOP, gère les chaînes d'intercepteurs et les invocations de méthodes.
@EnableAspectJAutoProxy : activez le proxy automatique de l'aspect AspectJ.
AnnotationAwareAspectJAutoProxyCreator : crée un proxy AOP pour appliquer les aspects de style AspectJ.
BeanFactoryAdvisorRetrievalHelper : aide à récupérer et à gérer les Advisor Beans dans Spring AOP.
BeanFactoryAspectJAdvisorsBuilder : créez des aspects d'annotation @AspectJ et générez des conseillers Spring AOP.
AspectInstanceFactory : crée des instances d'aspect et prend en charge plusieurs méthodes d'implémentation.
MetadataAwareAspectInstanceFactory : gère les instances d'aspect et les métadonnées, et prend en charge plusieurs stratégies d'instanciation.
AspectJAdvisorFactory : crée une instance de notificateur AspectJ et gère la création et la configuration des notifications d'aspect.
TargetSource : gère l'acquisition et la libération des objets proxy AOP.
TargetSourceCreator : crée des sources cibles spéciales et personnalise la création et la gestion des objets proxy.
AopContext : Outil pour obtenir des objets proxy Spring AOP.
ExposeInvocationInterceptor : un intercepteur qui expose le contexte d'invocation de la méthode Spring AOP.
@EnableLoadTimeWeaving : activez le tissage au moment du chargement de Spring.
Transaction de printemps
Connexion : gère les connexions à la base de données, exécute SQL et traite les transactions.
DataSource : fournit une interface pour une gestion efficace des connexions à la base de données.
DriverManager : la classe principale pour gérer et établir des connexions à la base de données.
JdbcTemplate : simplifie les opérations JDBC et fournit une abstraction pratique de l'accès à la base de données.
TransactionDefinition : définit le comportement de propagation des transactions et le niveau d'isolement.
TransactionAttributeSource : interface de stratégie pour obtenir les attributs de transaction.
PlatformTransactionManager : utilisé pour gérer et coordonner le cycle de vie et l'exécution des transactions.
TransactionTemplate : simplifie la gestion des transactions et prend en charge le contrôle programmatique des transactions et la gestion des exceptions.
SpringTransactionAnnotationParser : analysez l'annotation @Transactional et convertissez-la en configuration de transaction.
TransactionInterceptor : intercepteur de transactions, utilisé pour gérer le traitement des transactions au niveau de la méthode.
EnableTransactionManagement : activez la gestion des transactions basée sur les annotations de Spring.
PrintempsMVC
PrintempsOuvertFeign
contactez-moi
✉️ Envoyer un e-mail | Problème | CSDN Moi à propos de tout !
⛵Contributions bienvenues !
Si vous trouvez des erreurs ou avez des suggestions d'améliorations, veuillez soumettre un problème ou une pull request. Vos retours me sont très précieux !
Mise à jour continue
Afin de vous fournir le contenu le plus récent et le plus précieux, j'insisterai sur la mise à jour de cet entrepôt chaque jour⏳. Chaque jour, vous pouvez vous attendre à voir du nouveau contenu ou des améliorations du contenu existant. Si vous avez des suggestions ou des commentaires, n'hésitez pas à me contacter ?. J'apprécie chaque retour car c'est ma motivation pour l'amélioration continue.
Histoire des étoiles
?Observateurs d'étoiles
?Fourchettes
? M'inviter à une boîte à lunch ?
L'auteur doit écrire un blog le soir✍️ et doit également travailler en semaine. Si vous pouvez m'aider, pouvez-vous m'offrir un déjeuner ?
Suivre le compte public
Après avoir suivi, répondez avec le mot-clé « ajouter un groupe » pour rejoindre notre groupe d'échange technique afin de communiquer et d'apprendre avec plus de développeurs.