Spring Framework De IOC

IOC、DIConcepts de base

À propos deIOCEtDITout le monde n'est pas étranger.,On va tout droitmartin fowlerOriginal,Il y en a déjà.DIExemples etspringExemple d'utilisation de

《Inversion of Control Containers and the Dependency Injection pattern》

https://www.martinfowler.com/articles/injection.html

Nous ne nous concentrons ici que sur quelques concepts clés à considérer,Extrait d'une partie du texte original:

“As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.”

“ Je pense que nous devons donner à ce modèle un nom plus révélateur . L'inversion de contrôle est trop large , C'est souvent déroutant. . Et quelques IOC Après avoir discuté avec les fans, nous avons appelé ce modèle l'injection de dépendance. ”

Alors disIOC Est un concept abstrait , Utilisé pour décrire un cadre ,DI Est le mode de réalisation spécifique , On peut y aller. springSite officiel, C'est très délicat d'utiliser ces deux mots. .

“When these containers talk about how they are so useful because they implement "Inversion of Control" I end up very puzzled. Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels.”

“ Quand les concepteurs de ces conteneurs disent que ces conteneurs sont si utiles , Parce qu'ils ont réalisé “Contrôle de l'inversion”. Et je suis profondément confus , L'inversion de contrôle est IOC Caractéristiques communes du cadre , Si un cadre est caractérisé par une inversion contrôlée, c'est comme dire que ma voiture a des roues. .”

Si l'injection de dépendance n'est qu'une fonctionnalité de base du cadre , Qu'est - ce que c'est? springSenior、 Et les fonctions de base? ?

Allons voirspringSite officiel:

https://docs.spring.io/spring-framework/docs/current/reference/html/overview.html#overview-philosophy

Le premier point sur le concept de conception :

“Provide choice at every level. Spring lets you defer design decisions as late as possible. For example, you can switch persistence providers through configuration without changing your code. The same is true for many other infrastructure concerns and integration with third-party APIs”

“ Offre des choix à tous les niveaux .Spring Vous permet de reporter les décisions de conception autant que possible .Par exemple, Vous pouvez changer de fournisseur de couche de persistance en modifiant la configuration ,Sans modifier le Code. De nombreuses autres infrastructures et API Il en va de même pour l'intégration .”

Alors disspring Le cœur de IOC Fournir une variété d'infrastructures basées sur des concepts ,Ici.“Infrastructure” Peut également être interprété comme une consolidation abstraite de divers intergiciels .

DI Est la fonction la plus fondamentale , Fondations pour tous les autres modules fonctionnels . Donc, basé sur DIDe Toutes sortes d'applications. springCompétences de base.

IOC Ça ne marche peut - être pas normalement. , Mais c'est important au niveau de l'amarrage critique ou de l'architecture. :

Par exemple, la gestion des transactions ,Peu importejdbcToujoursoracle Quel est le Code d'implémentation de la transaction pour ,Nous l'utilisons uniformémentspring transaction( Bien sûr. AOP), Il suffit de modifier la configuration de la base de données associée .

Par exemple, le Registre dépend eureka, Je veux passer à nacosOuconsul, Le Code n'a pas besoin d'être modifié non plus. , Modifier les références de paquets associées , Il suffit de modifier la configuration liée au profil , Le Code ne bouge pas. .

Conclusions: Après avoir lu la description ci - dessus, je me sens encore très vide. ,C'est comme...martin fowlerCe que j'ai ditIOC L'injection dépendante de l'implémentation du conteneur n'a rien de spécial ,spring Quel soutien nous fournit l'injection de dépendance , Et la façon dont nous utilisons l'injection de dépendance pour assembler les services dans nos systèmes est plus critique , C'est ce qui est au centre de cet article. .

Pour mieux comprendre ce qui suit , On va juste poster. martin fowler Code dans l'article

Non.IOCDans le cadre:

Vous devez initialiser l'objet vous - même , Paramètres des objets dépendants

class MovieLister...
private MovieFinder finder;
public MovieLister()
{
finder = new ColonDelimitedMovieFinder("movies1.txt");
}

Si des modifications sont nécessairesfinderRéalisation, Doit être modifié directement MovieLister(Haut niveau)Code, C'est ce qu'on appelle souvent une dépendance de haut niveau à l'égard du bas. , L'implémentation sous - jacente a changé , Le Code de haut niveau va changer. .

Oui.IOCDans le cadre:

On est sur l'épaule du géant. , Comme un localisateur de service DI, Mais on ne s'en soucie pas ici.

Nous donnons des exemples d'étapes de codage que nous avons l'habitude de suivre pour l'injection de dépendance. :

1、  Écrire la configuration(xmlDocumentation、Notes、java config)

2、  Configuration de chargement, En configurant les objets de production ( Chargement instantané ou paresseux )

3、  Obtenir l'objet injecté

Java config Configurer la classe:

@Configuration
public class MovieConfig{
@Bean
MovieLister movieLister(MovieFinder movieFinder){
return new MovieLister(movieFinder);
} @Bean
MovieFinder movieFinder(){
return new ColonDelimitedMovieFinder (“movies1.txt”)
}
}

Code:

public void testWithSpring() throws Exception {
ApplicationContext ctx = new AnnotationConfigApplicationContext(MovieConfig.class);
MovieLister lister = (MovieLister) ctx.getBean("movieLister");
}

Principaux objets

Pour une meilleure compréhension , Nous essayons de cartographier les objets du monde réel un par un dans le monde virtuel

Le monde réel

Prenons l'exemple de l'hôtel. (Clic droit- Nouvel onglet ouvert Vue agrandie )

Quelques objets clés :

Restaurant de transformation des fruits de mer

Avoir ses propres panneaux et caractéristiques , Notez cependant que tous les ingrédients de l'hôtel doivent être fournis par le client. .

Système de facturation

Commande du client à la carte ( Va à la réception ou trouve un serveur. , Parce que je dois remettre ma nourriture à l'hôtel. ) Imprimer automatiquement la commande du client , Les commandes imprimées sont complétées par des noms de plats :Numéro de série、 Numéro de la table 、 Goût des plats, etc. . Le devoir est d'imprimer l'information sur les commandes de façon concise et claire. , Pour les cuisiniers ou autres .

Examinateur de commandes

Nous devons faire un pas dans ce restaurant , C'est - à - dire qu'après l'émission de la commande, le client doit confirmer la commande. , Les commandes sont confirmées avant d'être livrées à la cuisine. , L'un des objectifs est d'éviter les retards ou les erreurs de communication des clients. , Deuxièmement, la communication confirmée améliore également l'expérience utilisateur. .

Pourquoi on appelle ça un examinateur de commandes? , Au lieu d'appeler un serveur , Parce qu'on a l'impression que les serveurs font beaucoup d'autres choses. , Cela affaiblit l'action clé de confirmation de commande .

Chef.

Cuisiner selon les ingrédients livrés et les commandes , La cuisine se concentre sur la façon de préparer les plats en fonction des commandes et des ingrédients. .

Monde virtuel

(Clic droit- Nouvel onglet ouvert Vue agrandie )

C'est peut - être un peu confus de regarder directement cette image. , Nous vous expliquerons et vous expliquerons plus loin. ,Votre attention, s'il vous plaît., Le reste de ce chapitre est consacré à cette image. , Ce graphique est très important .

Le monde réel

Monde virtuel

Description

Restaurant de transformation des fruits de mer

ApplicationContext

Comparaison des hôtels de transformation des fruits de mer , Les cuisiniers de la cuisine sont ses ouvriers. , Il a fait un menu exquis pour attirer les clients ,@Component、@Configuration、@Bean Ce sont ses plats en or. , En fait, le cuisinier est emballé. , Et il y a une porte pour attirer les clients .

Menu fruits de mer

Java config

Spring IOC Plats de marque uniques :@Component

@ComponentScan @Bean @Import Attends un peu.

Chef.

BeanFactory

Cuisiner selon les ingrédients et les commandes ; Il n'y a pas d'hôtel, il n'y a que des boutiques de rue. .

Système de facturation

BeanDefinitionRegistryPostProcessor

équivalent à un système de sortie unique , Convertir les plats désirés par le client en commandes ,Par [email protected] @Configuration Classe d'annotation convertie en BeanDefinition;Basé surjava config On ne peut pas le quitter.

C'est aussiBeanFactoryPostProcessorSous - classe

Examinateur de commandes

BeanFactoryPostProcessor

Les plats n'ont pas été préparés lors de la confirmation des informations de commande , Par exemple, vous pouvez permettre au client de modifier certaines informations sur la commande

Ordre

BeanDefinition

Informations sur la commande , L'arrière - cuisine doit regarder l'ordre pour cuisiner.

Produits finis

Bean

Produit final

De l'exemple ci - dessus, nous pouvons à peu près distinguer BeanFactoryEtApplicationContextLa différence entre.

Spring Peut nous impliquer dans n'importe quel rôle :Clients、 Propriétaire d'un restaurant de transformation de fruits de mer 、 Système de facturation 、 Examinateur de commandes 、Chef., Peut participer à n'importe quel lien .

Que pouvons - nous faire d'intéressant? ?

Par exemple, vous pouvez créer un menu avec nos caractéristiques ,[email protected] Spécialités .

Ajouter des boissons gratuites à toutes les informations de commande lors de la confirmation de la commande (xmlDéclarationbeanDans les propriétés de${xx} Remplacement des substituants )Attendez.

Après une compréhension préliminaire de ces éléments clés, , On va aller plus loin. , Voyez ce qu'ils font.

BeanFactory

Donnez - moi les informations de commande et les matières premières et je le ferai. , Les commandes et les ingrédients sont indispensables

Concentrons - nous sur la cuisine. , Parce que la cuisine est au cœur de l'hôtel .

Inspring frameworkMoyenne,BeanLe cycle de vie deBeanfactory C'est déjà fermé.

ApplicationContext Juste un peu de matériel. , Par exemple, scan java configS'échapper enBeanDefinitionVoilà.BeanFactory, Puis ajoutez - en d'autres BeanPostProcessorAttendez..

Notez que cet article se concentre sur le courant dominant java configMise en œuvre de la configuration,En fait...xml Les fichiers sont configurés de la même manière , Ce n'est pas le but de cet article. .

BeanFactoryQuel est le cycle de vie de,Ça marche.BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor Classes d'implémentation pour ces deux Interfaces ,Allez.BeanFactoryInscriptionBeanDefinitionEt modificationsBeanFactoryÀ l'intérieur.BeanDefinition Et autres informations .

BeanDefinition

À quoi ressemble l'information sur les commandes dans le monde virtuel ? Il a joué un rôle crucial dans la liaison .

Pourquoi commencer? BeanDefinitionEt alors?, Doit être généré indépendamment de la configuration BeanDefinition,InBeanTout au long de son cycle de vie, La première étape est aussi getMergedBeanDefinition.

Regardons d'abord.BeanDefinition Héritage du diagramme de classe pour

BeanDefinition Correspondance entre la classe de mise en œuvre et chaque scénario ,Ici, nous nous concentrons uniquement surjava configScènes

Configurer le scénario

BeanDefinitionCatégorie de mise en œuvre

Description

@ComponentEt ses sous - classes,

Par exemple:

@Configuration

@Service

AnnotatedGenericBeanDefinition

Aucune

@Bean

ConfigurationClassBeanDefinition

Aucune

@ComponentScan Classes numérisées :

ScannedGenericBeanDefinition

Aucune

Aucune

RootBeanDefinition

Oui.parentNameDebean Résultats de la consolidation

Souvent utiliséxml Déclaration de profil bean

GenericBeanDefinition

Aucune

RootBeanDefinition(merged bean definition)

Bean Le plus important du cycle de vie BeanDefinitionCatégorie de mise en œuvre

Parce que peu importe ce qui se passe au milieu, BeanDefinition, Quoi qu'il arrive,

En fin de compte,bean Tout au long du cycle de vie RootBeanDefinition

Lorsque la synthèse intégrale RootBeanDefinition Après,Doncspring Nous laissera un post - processeur unifié :MergedBeanDefinitionPostProcessor

BeanDefinitionPropriétés de:

Propriétés

Type

Description

parentName

ChildBeanDefinition

String

équivalent àjava Parent héréditaire de ,spring Et à la fin, tous les types bean Se frottant ensemble pour former un nouveau RootBeanDefinition;

SeulementChildBeanDefinition La valeur de l'attribut n'existe que

beanClass

AbstractBeanDefinition

Object

Peut êtrestring Ou pour class<?>

Peut également être vide, Si elle est vide, elle passe essentiellement par factoryBeanName、factoryMethodName Désinstaller l'objet

scope

String

Valeur:

singleton

prototype

refresh (spring cloud)

La valeur par défaut est vide, Lorsqu'il est vide, il est traité comme un seul cas ]

singleton

Voir dé[email protected];

@Scope L'utilisation d'annotations est un peu astucieuse ,Par [email protected] est le principe??

lzyInit

Boolean

Chargement différé ou non

ApplicationContext.refresh() Ne pas charger ,getBean() Ne pas charger avant

Voir dé[email protected]

autowireMode

AbstractBeanDefinition

int

C'est en faitDI De plusieurs façons d'injecter ,Pour l'instantjava config Déjà flexible , Il suffit de définir la forme de l'annotation directe

AUTOWIRE_NO(Par défaut)

Mode d'assemblage par défaut , Actuellement non xml La configuration utilise cette méthode , Puis le programmeur injecte manuellement des annotations

AUTOWIRE_BY_NAME

AdoptionsetMéthodes,Et set Le nom de la méthode nécessite et beanDenameD'accord.

AUTOWIRE_BY_TYPE

AdoptionsetMéthodes, Et selon beanType de,Propriétés d'injection, Est configuré par type

AUTOWIRE_CONSTRUCTOR

Injection par constructeur

Spring @BeanAnnotatedautowire La propriété peut être définie pour nous ,Peut également passer parBeanFactoryPostProcessorPour modifierBeanDefinitionDeautowireMode; Mais en général, ça ne sert à rien de changer ça. .

@Bean Parce que c'est une annotation sur la méthode ,Alors c'estAUTOWIRE_CONSTRUCTOR

@Autowired Oui.AutowiredAnnotationBeanPostProcessor Par défaut, le type est utilisé pour trouver le type correspondant. bean,Similaire àAUTOWIRE_BY_TYPE, C'est ici aussi. @QualifierAnnotatedbean nameTrouver.Parce [email protected] Juste une valeur de propriété qui n'est pas BeanDefinition, Non. autowireMode Attribut I

dependsOn

String[]

Sur quoi?bean,Charger cecibean Les dépendances seront chargées en premier bean, Chargez - le à nouveau. bean

Voir dé[email protected]()

autowireCandidate

Boolean

Définir le courantbean Lorsque d'autres objets sont injectés automatiquement , Candidat ou non bean,Par défauttrue

Si elle est réglée àfalse Autre chose. bean Référence non disponible bean

@Scoped(“”)Quand la valeur n'est pas vide,beanOriginalBeanDefinitionSera réglé àautowireCandidate =false, Un nouveau beanClass Pour la classe Proxy classDeBeanDefinitionParamètresautowireCandidate=true, Remplacer l'original beanDefinition

primary

Boolean

Le réglage est - il le candidat préféré? bean

N'affecte que les utilisateurs , N'a aucun effet sur la construction de l'objet original , Objet original beanOu générer; Seulement quand l'arrière est utilisé ailleurs ,BeanFactory Pour juger des choix

@Primary

qualifiers

AbstractBeanDefinition

Map<String, AutowireCandidateQualifier>

Register a qualifier to be used for autowire candidate resolution, keyed by the qualifier's type name

N'affecte que les utilisateurs , N'a aucun effet sur la construction de l'objet original , Objet original beanOu générer; Seulement quand l'arrière est utilisé ailleurs ,BeanFactory Pour juger des choix

@Qualifier Besoins et @AutowiredÀ utiliser ensemble

instanceSupplier

AbstractBeanDefinition

Supplier<?>

Fournisseur d'objets instantanés , Essentiellement pas personnalisé

isFactoryBean

RootBeanDefinition

Boolean

Oui NonFactoryBeanInterface, Tant que ça n'arrivera pas. FactoryBean Toutes les interfaces sont false;

factoryBeanName

String

AvecisFactoryBean- Non.

Ça peut être n'importe quoi.beanName, Et n'a pas besoin d'être mis en œuvre FactoryBeanInterface

factoryMethodName

String

AvecisFactoryBean- Non.

Par cette méthode bean,Nécessité de combinerfactoryBeanNameUtilisation

constructorArgumentValues

ConstructorArgumentValues

Définition du constructeur, Inclure l'ordre des paramètres, etc.

propertyValues

MutablePropertyValues

Souvent utiliséxmlDéclarationbean;Oui.xmlLebeanTous lesproperty Les valeurs des clés d'étiquette sont placées ici. ;

Peut également être utilisé pourspring Contexte interne beanInformations sur,C'est comme...Servlet HttpRequest.setAttribute(key,value)

initMethodName

String

Initialiser le nom de la méthode

destroyMethodName

String

Bean Nom de la méthode déclenchée lors de la destruction

role

int

Par quel système est déclaré bean

ROLE_APPLICATION

ROLE_SUPPORT

ROLE_INFRASTRUCTURE

description

String

BeanDescription de,Souvent utiliséxmlDans la configuration<description>Noeud

isSingleton

boolean

Jugementscope.equals(“singleton”)

IsPrototype

boolean

Jugementscope.equals(“prototype”)

isAbstract

String

Classe abstraite ou non

FactoryBeanInterfaces

Deux façons:

C'est fait.spring FactoryBeanInterfaceBeanDefinitionPropriétésisFactoryBean=true(RootBeanDefinition,merge beandefinition Post - visible )

Par [email protected] Annotated generated bean,mybatisDemapper C'est tout. FactoryBean Contenu de l'interface

Attention!factoryBeanName、factoryMethodName L'utilisation de ,En ce momentisFactoryBean=false

BeanDefinitionRegistryPostProcessor

Selon le menu et les informations du client au moment de la commande , Générer des commandes pour les sous - chefs

Action surBeanFactory,- Oui.BeanFactory Portes réservées au monde extérieur , La mise en œuvre concrète est réalisée ApplicationContextDans le cycle de vie.

Inspring C'est le général. @Configuration、@Bean Génération d'informations de configuration égales BeanDefinitionInscrivez - vous àBeanFactory.

DeBeanFactoryPostProcessor

Le système d'émission doit être mis en œuvre BeanDefinitionRegistryPostProcessorMéthode d'interface

(ApplicationContext L'hôtel lui - même peut commander le chef. Par exempleClassPathXmlApplicationContext,Juste là.applicationContext Dans le cycle de vie (refreshDans la méthode, Avant de passer la commande au Chef )AnalysexmlAllez.BeanfactoryInscriptionBeanDefinition)

Parce que j'ai hérité. BeanFactoryPostProcessorInterface, Par conséquent, la fonction de confirmation de commande est également fournie.

Par exemple, certaines implémentations typiques :

1、java config Principales classes de mise en œuvre pour :ConfigurationClassPostProcessor

2、mybatisDe MapperScannerConfigurer,[email protected] Interface enregistrée comme BeanDefinition

public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor

Note::MapperScannerConfigurerC'est juste...Mybatis mapper Une façon d'injecter

ConfigurationClassPostProcessor

Le plus importantBeanDefinitionRegistryPostProcessor Aucune des classes d'implémentation

 

On a utiliséjava config Sont transformés par ses mains BeanDefinition,Parce queBeanDefinitionRegistryPostProcessorDeBeanFactoryPostProcessor, C'est ce qui s'est passé. postProcessBeanFactoryMéthodes. Le but de cet article est IOC Compréhension du processus , Cette section décrit donc principalement ProcessorProcessus de mise en oeuvre du code source.

ConfigurationClassPostProcessorLepostProcessBeanFactoryRegistry Méthode responsable de l'enregistrement bean,[email protected] @ComponentScan L'isoannotation est résolue en BeanDefinitionInscrivez - vous àBeanFactory;postProcessBeanFactory La méthode est responsable de la modification BeanDefinition,[email protected] Annotated class BeanDefinitionDebeanClass Remplacé par un mandataire class name.

LeBeanDefinitionRegistryPostProcessor Et ce n'est pas un saut d'une pierre. ,DerrièreApplicationContext Le cycle de vie de .

postProcessBeanFactoryRegistry

Boucle tous les actifs actuels BeanDefinition, Cherchez ceux qui ont @Configuration Classe annotée pour le traitement , Il peut également y avoir des classes internes , Je vais le charger. , Mais l'ordre suit l'extérieur. @ConfigurationOn y va ensemble.,@Configuration Peut également être ajouté @Order Les annotations sont utilisées pour @ConfigurationDebean Charger dans l'ordre du plus petit au plus grand après tri

Peut également être combiné@ConditionalUtilisation des annotations,Si vous n'êtes pas satisfaitConditionalConditions, Ne pas charger Configuration

Un.、Trouver le courantBeanFactoryTous [email protected] à [email protected]

2.、 Trouvé en boucle BeanDefinition,Convertir enConfigurationClass

2.1 Traiter d'abord si classOui.NidificationCatégorie,S'il y [email protected] [email protected] Notes, Se transformant également en indépendant ConfigurationClass

2.2 @PropertySources @PropertySourceTraitement,AjouterPropertySourceàenvironment

2.3 @ComponentScans @ComponentScanTraitement,Scanjava configNotes. à numériser classConvertir enBeanDefinition; Puis appelez la première étape ci - dessus , Comme un appel récursif

2.4 @ImportTraitement

NotesvalueLa valeur estImportSelectorClasse de mise en œuvre de l'interface, Méthode d'interface d'appel direct selectImports Retour! String[],classCollection de noms de classe, Appelle encore. processImportsMéthodes

NotesvalueLa valeur estImportBeanDefinitionRegistrarClasse de mise en œuvre de l'interface,Ajouter àConfigutaionClassPropriétés deimportBeanDefinitionRegistrars【La clé】

Notesvalue Pas les deux classes d'implémentation d'interface ci - dessus , Transformation de l'annotation du jugement de marche directe ConfiurationClassTraitement

2.5 @ImportResourceTraitement,Ajouter àConfigutaionClassPropriétés deImportedResource

2.6Trouver@BeanAnnotatedmethod,Ajouter àConfigurationClassPropriétés debeanMethod

2.7 Trouver le courant classDeInterface,S'il y [email protected],Ajouter àConfigurationClassPropriétés debeanMethod(Parce quejava8DeinterfaceOui.default methodL'existence de, Ainsi, les méthodes d'interface peuvent également être générées bean)

2.8 Trouver le courant classDeParent,S'il y [email protected] [email protected] Notes, Se transformant également en indépendant ConfigurationClass( Traitement des mêmes classes imbriquées )

Trois、ToutConfigurationClassConvertir enBeanDefinitionInscrivez - vous àBeanFactory

Quatre、ToutConfigurationClassDebeanMethodConvertir enBeanDefinitionInscrivez - vous àBeanFactory.

Cinq、ToutConfigurationClassDeImportedResourceConvertir enBeanDefinitionInscrivez - vous àBeanFactory.

Six、ToutConfigurationClassDeimportBeanDefinitionRegistrars,Appelez - le.registerBeanDefinitionsMéthodesBeanDefinitionInscription,Même chose.BeanDefinitionRegistryPostProcessor, Est également utilisé pour l'enregistrement BeanDefinition【La clé】

En [email protected] être combiné [email protected]、@BeanNotes à utiliser, Ne pas charger si la condition n'est pas remplie BeanDefinition

@Configuration

@Component
public @interface Configuration {

ConfigurationClass Attributs clés de l'objet ([email protected]、@Component Résultat de la classe annotée )

Propriétés

Type

Description

metadata

AnnotationMetadata

@Configuration

Ensemble d'annotations pour la classe

beanName

String

PojoNom de la classe

beanMethods

Set<BeanMethod>

@Bean Ensemble de méthodes pour

importedResources

Map<String, Class<? extends BeanDefinitionReader>>

À charger xmlProfil

importBeanDefinitionRegistrars

Map<ImportBeanDefinitionRegistrar, AnnotationMetadata>

À charger

ImportBeanDefinitionRegistrarInterface

Pour l'inscriptionBeanDefinition

@Bean

[email protected]@Component Dans les notes @BeanMéthode d'annotation, Sera enregistré comme BeanDefinition, Et puis, BeanClassVide,[email protected]@ComponentClassebeanName;factoryMethodNameC'est @Bean Nom de la méthode annotée .

C'est ce qui est utilisé iciBeanDefinition Contenu factoryBeanNameEtfactoryMethodNameTraitement, Autres catégories confiées (@ConfigurationCatégorie)Pour générerbean.

@Import

À l'arrière. spring boot AutoConfigurationEssentiel

Un.、NotesvalueLa valeur estImportSelectorClasse de mise en œuvre de l'interface, Méthode d'interface d'appel direct selectImports Retour! String[],classCollection de noms de classe, Encore un scan.

2.、NotesvalueLa valeur estImportBeanDefinitionRegistrarClasse de mise en œuvre de l'interface,Est appeléregisterBeanDefinitionsMéthodes,En coursBeanDefinitionInscription;
Est égal à BeanDefinitionRegistryPostProcessorLa fonction de.

Trois、Notesvalue La valeur n'est pas dans les deux classes d'implémentation d'interface ci - dessus , Numériser directement cette classe

Spring boot starter Noyau introduit automatiquement

@EnableAutoConfiguration
public @interface SpringBootApplication {
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
public class AutoConfigurationImportSelector implements ImportSelector {

Leselector Va tout scanner. spring.factoriesDans le dossier

org.springframework.boot.autoconfigure..EnableAutoConfiguration Classe de propriété

Mybatis @MapperScan

@Import(MapperScannerRegistrar.class)

Feign @EnableFeignClients

@Import(FeignClientsRegistrar.class)

C'est généralement enregistré ici. GenericBeanDefinition

postProcessBeanFactory

Il s'agit deAOPConnaissances

Traitementjava-configNotes pertinentes @Configuration @ComponentScan @Import Attendez de les convertir en BeanDefinitionEt s'inscrire àBeanFactoryMoyenne, La réalisation concrète implique également AOPConnaissances. Parce que nous nous concentrons sur le processus opérationnel global .

[email protected] Annotation convertie BeanDefinition,BeanClass Propriété changée en AOP Généré après l'agent class, Derrière. bean Le cycle de vie instantané est post - proxy class

Pourquoi utiliser un agent?

@Configuration
public class MovieConfiguration {
@Bean
public MovieLister movieListener(){
return new MovieLister (this.movieFinder ());
}
@Bean
public MovieFinder movieFinder(){
return new ColonDelimitedMovieFinder ("movies1.txt");
}
}

Et ça passe ici. AOPAprès amélioration, Et ne sera pas confronté Appel de méthode interne AOPLe problème de l'échec(Pourquoi?movieListener Ici, on appelle movieFinder Pas déjà. super classC'est bon?,Pas vraiment., Ce parent est aussi représenté. ,cglibPratique de, Parce que tant que c'est le cas, @Bean Les méthodes d'annotation ont été bloquées par l'agent , Si le nom de la méthode n'est pas délégué , C'est une exécution directe. superCode original de), Comme ci - dessus movieListenerÀ l'intérieur.movieFinderPropriétés,Et en basmovieFinderMéthode généréebean,C'est le mêmebean; Si vous êtes intéressé, consultez le code source.

Comment voircglib Code amélioré ,Je peux recommencer.main Ajouter les paramètres suivants à la première ligne de la fonction

public static void main(String[] args) {
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"C://");

@ComponentNotes(Inclure ses sous - [email protected] @Controller) Les classes de @Bean,Quelle est la différence?, C'est ça. LITE Mode léger , Ne pas générer d'agents comme ci - dessus (@Configuration- Oui.FULLMode),C'est - à - dire au - dessus. movieListennerÀ l'intérieur.movieFinderObjet et BeanFactoryÀ l'intérieur.bean movieFinder Est deux objets différents.

BeanFactoryPostProcessor

Un client s'est précipité et le chef a dit: J'ai oublié de dire "pas de poisson pour la perche à la vapeur".

Ce que vous pouvez faire avec une commande après avoir reçu la commande , Principalement la modification de l'ordre , Annulation pratiquement impossible , C'est comme manger dans un restaurant. , J'ai demandé au serveur s'il y avait un plat que je n'avais pas préparé. , À ce moment - là, le serveur doit vous dire ce qu'il fait. .

Action surBeanFactory,- Oui.BeanFactory Portes réservées au monde extérieur , La mise en œuvre concrète est réalisée ApplicationContextDans le cycle de vie.

Scénario utilitaire classique,BeanDefinition Remplacement des variables de valeur des attributs

C'est exact.BeanDefinition Modification des valeurs des attributs , Où que vous soyez inscrit ,Tout ira bien.

Classique :

PropertySourcesPlaceholderConfigurer

 

BeanDefinition Le remplacement des variables de valeur d'attribut suivantes est effectué ici (@[email protected] La variable in n'est pas remplacée ici 、SpEL Pas ici non plus. )

RemplacerBeanDefinition La plage et l'ordre des valeurs des attributs sont les suivants: :

parentName

beanClassName

factoryBeanName

factoryMethodName

scope

propertyValues

constructorArgumentValues

BeanLe cycle de vie de

Je ne peux pas l'inventer. , C'est un exemple de cuisine. , J'ai besoin de cheveux blancs. . Nous ne prenons pas l'exemple de la cuisine ici. , Vous ne pouvez donner qu'un exemple de création de classe

Processus normal de création de classes :

(1)MovieListener listener = new MovieListener();
MovieFinder finder = new ColonDelimitedMovieFinder("movies1.txt");
(2)listener.setFinder(finder);
listener.setStartTime(new Date());
(3)listener.init();

Correspond aux trois étapes ci - dessus , Nous avons trois approches :

1、Instanciation

2、populateBeanAttribution des attributs(@Autowired Les injections dépendantes des attributs sont traitées ici )

3、Initialisation( Après l'attribution de la propriété , Nous sommes prêts à commencer le service à l'extérieur )

Alors...spring Pour nous impliquer bean Processus d'Instanciation et d'initialisation de , Il nous a laissé une bouche.

Pourquoi diviser une deuxième étape populateBeanEt la méthode?, Une séparation plus fine est en fait bénéfique ,Par exemplespring cloudUne combinaison [email protected]@ConfigurationPropertiesUtilisationbean,J'ai utilisébeanDans le cycle de viedestroyEtinitializeBean Méthode d'initialisation, L'Instanciation et l'assignation des attributs ont été sautées , Déclenchement direct

ConfigurationPropertiesBindingPostProcessorEn [email protected] Annotation de la liaison des valeurs d'attribut d'une classe ( L'attribution des attributs ici n'est pas @Autowired @Value Une telle attribution de propriété ,[email protected](prefix = "xxx") Annoter les propriétés de la classe ); Parce qu'il a été initialisé à nouveau à l'étape 3 initializeBean, Ainsi, les propriétés de l'injection dépendante de l'étape 2 ne seront pas modifiées , Économies réalisées

BeanPostProcessor

InbeanTout au long de son cycle de vie, Quels liens pouvons - nous impliquer? ,spring Le plus important pour nous est de passer par trois catégories BeanPostProcessor Va t'impliquer. .

BeanPostProcessor Héritage de la classe pour

Couramment utilisé BeanPostProcessorComme suit:

CommonAnnotationBeanPostProcessor

springLe plus importantBeanPostProcessorUn

@Resource

Attribution des attributs d'annotation ,Trouver la correspondancebean Assigner des attributs

@WebServiceRef

Peu fréquent,Sans explication

DeInitDestroyAnnotationBeanPostProcessor Le traitement comprend également les deux notes suivantes:

@PostConstruct

Méthode d'exécution de l'annotation , Voir quand “Monde virtuel” Légende de

@PreDestroy

Effectuer une modification de la méthode d'annotation lors de la destruction , On doit trouver comment on est nés. , Réfléchis à autre chose. ,Pas d'explication ici..

AutowiredAnnotationBeanPostProcessor

Spring bootLe plus importantBeanPostProcessor Non.

@Autowired

Questions fréquemment posées:

Pourquoispring bean Pas dans le cache de niveau 1 ResourceLoader、ApplicationContext、ApplicationEventPublisher、BeanFactoryQuestions connexesbean,@Autowired Pourquoi injecter des objets? ?

C'est là que les jugements de type liés au Code sont effectués. , Si c'est là - haut 4Type, J'ai trouvé l'objet correspondant. .

@Value

${xx}  #{xx}  Quelle est la différence entre les substituants Est le remplacement normal des attributs et SpELMise en œuvre

@Qualifier

Coopération [email protected],@Autowired Je cherche quelque chose de pertinent. beanHeure, Il appuie aussi. @QualifierDésignationbean namePour trouver.

ConfigurationPropertiesBindingPostProcessor

Spring boot Important BeanPostProcessor

@ConfigurationProperties Traitement des classes d'annotation

AnnotationAwareAspectJAutoProxyCreator

AOP- Oui.,Spring AOP Le plus importantBeanPostProcessorNon.

@AspectTraitement,Oui.aop Les classes de méthodes numérisées sont générées aopAgents, On n'explique pas grand - chose ici non plus. ,DeAOPLe contenu de.

Nous allons entrer dans les sections suivantes beanLe cycle de vie de, Voici un autre regard sur notre monde virtuel (Clic droit- Nouvel onglet ouvert Vue agrandie )

getMergeBeanDefinition

FusionnerBeanDefinition

Pourquoi fusionnerBeanDefinition, Nous utilisons des mots ici ou avec spring Le nom de la méthode dans le code source est cohérent , C'est pour que tout le monde puisse voir le code source pour mieux correspondre. .

Parce quejava Concept de conception orientée objet , Les classes sont héréditaires

Comme suit: xmlMode de déclaration,parent Ça marche. ,GénérerbeanQuandparent bean Les propriétés sont également injectées , Cela permet d'utiliser les propriétés et les méthodes de la classe mère .

<bean id="movieListener" class="spring.MovieListener" parent="abstractMovieListener">
</bean>
<bean id="abstractMovieListener" class="spring.AbstractMovieListener">
</bean>

Java configBasé [email protected] Les annotations sont presque inutiles , Parce qu'aucun n'est généré ChildBeanDefinition

Comment fusionner,Va voir.AbstractBeanDefinition Le constructeur de BeanDefinition Comment convertir en RootBeanDefinition, Nous n'afficherons pas le code source ici .

Instantiation Instanciation

Qu'est - ce que l'Instanciation   new MovieListener() Est - ce que

Il s'agit destatic Si le bloc de méthode doit être exécuté , Et si le constructeur doit être exécuté ,spring La valeur par défaut est de

postProcessBeforeInstantiation

ParInstantiationAwareBeanPostProcessorDéclencheur

Que puis - je faire ici? ,Quels scénarios sont utilisés, S'il y a un objet de retour ici , Va directement à BeanPostProcessor.postProcessAfterInitializationComment?, Est de sauter directement à la fin du cycle de vie , Aucun cycle de vie n'est exécuté pendant

createBeanInstance

Et ici, Il n'y a pas de scène pour le moment. ,Maisspring Et nous donne l'occasion de participer =>BeanDefinitionÀ l'intérieur.instanceSuplier

postProcessMergedBeanDefinition

ParMergedBeanDefinitionPostProcessorDéclencheur

Que puis - je faire ici? ,Quels scénarios sont utilisés,spring Pourquoi nous laisser cette bouche? ?

InBeanDefinitionRegistryPostProcessorInscriptionBeanDefinitionPeut être n'importe quel type,Mais dansbeanDans le cycle de vie(Avant d'instancier), Se transforme en RootBeanDefinition;Donc icispring Il nous a laissé une bouchée. , Allons visiter RootBeanDefinition, Peut être utilisé pour obtenir des informations et modifier BeanDefinitionInformation;

D'abord, découvrez ce que c'est. :merged bean definition

Return a RootBeanDefinition for the given bean, by merging with the

parent if the given bean's definition is a child bean definition.

InBeanDefinition Déjà généré mergeC'est parti.,Peu importe., Obtenir avant l'Instanciation mergedBeanDefinition(En fait,RootBeanDefinitionType)

Maintenant que vous pouvez l'utiliser pour modifier BeanDefinition, Pourquoi le post - traitement ne nous appelle - t - il pas avant l'Instanciation de l'objet? ?En cas de modificationBeanDefinition, Alors c'est en fait BeanFactoryPostProcessorPour modifierBeanDefinition C'est ambigu. .Si vous souhaitez modifierBean Classe instantanée pour ,Il faut y aller.BeanFactoryPostProcessor, Ceci n'affecte que le cycle de vie après l'Instanciation .

C'est une dernière chance. , Peut être modifié BeanDefinition(Attention.beanDéjà instantané)

AutowiredAnnotationBeanPostProcessor Et

CommonAnnotationBeanPostProcessor

Ici postProcessMergedBeanDefinition Est de mettre en cache chaque classe à l'avance @Autowired、@Value Informations sur les attributs isoannotés ,DerrièrepostProcessProperties C'est tout. . Pas ici, pas après le cache.

Ici, nous avons principalement analysé applyMergedBeanDefinitionPostProcessors Le rôle de ce code , Il est exécuté après la création de l'objet , Propriétés avant Injection . Selon la définition officielle , Nous pouvons encore utiliser cette méthode pour modifier bdDéfinitions, Par rapport au passage BeanFactoryPostProcessor Modification de la méthode bd,applyMergedBeanDefinitionPostProcessors Cette approche a moins d'impact ,BeanFactoryPostProcessor C'est tout. BeanLe cycle de vie de,EtapplyMergedBeanDefinitionPostProcessors N'affecte que le cycle de vie après l'injection de l'attribut .

polulateBean Attribution des attributs

Pourquoi les assignations d'attributs doivent - elles être retirées séparément? , Appartient - il à l'initialisation? ;Inspring Pas encore. ,Mais attention.spring [email protected] C'est un appel direct. destroy La méthode d'initialisation est appelée directement après la méthode , Attribution de la propriété sautée , En fait, j'ai sauté. @Autowired @Value Le processus d'attribution des attributs pour etc. conserve l'original .

postProcessProperties

ParInstantiationAwareBeanPostProcessorDéclencheur

Voilà.beanAttribution des attributs pour

AutowiredAnnotationBeanPostProcessor Et

CommonAnnotationBeanPostProcessor

C'est ici que vous les donnez séparément. @Autowired @Value、@Resource Attribut attribué par réflexion

postProcessPropertiesValues(Deprecated)

ParInstantiationAwareBeanPostProcessorDéclencheur

Actuellement obsolète , Par dessus. postProcessPropertiesSubstitution de méthodes

applyPropertyValues

BeanDefinition- Oui.propertyValuesDeSpEL C'est ici que ça se passe. ,Adoptionjava config Les classes configurées ne sont plus utilisées ici.

Initialization Initialisation

Qu'est - ce que l'initialisation , En termes simples, les méthodes d'exécution des classes

DiversAwareMéthode d'interface

Pour recevoir toutes sortes de springObjet

postProcessBeforeInitialization

ParBeanPostProcessorDéclencheur

CommonAnnotationBeanPostProcessor

@PostConstruct La méthode annotée est appelée ici pour exécuter

InitializingBean.afterPropertySet

L'appel est implémenté InitializingBeanInterfacebean,Appelez - le.afterPropertySetMéthodes

postProcessAfterInitialization

ParBeanPostProcessorDéclencheur

Les scénarios d'utilisation courants sont les suivants: AOP  AnnotationAwareAspectJAutoProxyCreator, Retourner l'objet proxy après l'avoir proxy é , Les objets proxy sont utilisés plus tard .

invokeCustomInitMethod

DéclencheurBeanDefinition- Oui. initMethodMéthodes,ParxmlDéfinibean Vous pouvez définir le nom de la méthode ,Basé surjava config Ça ne marche plus. , Ça marche. [email protected] Comme alternative à la mise en œuvre

Cache L2

ChaquebeanLors de la création, Instancier l'objet (Type de référence)Mise en cache secondaire(Instanciation terminée), Une fois l'initialisation terminée, placez l'objet dans le cache de niveau 1 , Supprimer le cache L2 en même temps (Instanciation+ Initialisation terminée ,Completbean)

Résoudre les dépendances circulaires entre les objets

Par exempleA DépendanceB ,BDépendanceA

A Créer en premier :

AInstancier d'abord=》Mise en cache secondaire( Instanciation du stockage , Objets non initialisés )

ALors de l'initialisation, Attribut trouvé nécessitant une injection B

BInstanciation=》Mise en cache secondaire

BLors de l'initialisation, Attribut trouvé nécessitant une injection A,Accès à partir du cache secondaire,Je l'ai.A

BInitialisation terminée=》Mise en cache de niveau 1( Instanciation du stockage 、 Initialisation complète )

AInitialisation terminée=》Mise en cache de niveau 1

C'est tout.,EnfinA,B Dans le cache de niveau 1 ;Inspring ioc containerDans le concept, Il suffit de comprendre le cache L2 ,Il s'agit deAOPQuand, Regardez le cache de niveau 3 et voyez ce qu'il fait. .

Cache de niveau 3

Non.AOPAvant, Cache secondaire suffisant ,AOPAprès l'adhésion, Pour ne pas affecter le cache L2 existant , Ajout délibéré d'un cache de troisième niveau . L'objet Proxy est placé dans le cache de niveau 3 au lieu du cache de niveau 2 .

En plus, c'est pour suivre AOPDécouplage, N'affecte pas l'original IOC Basé sur le cache L2 , Une couche supplémentaire indépendante , Résoudre le problème , Le découplage est également réalisé .

ApplicationContext

Comment se connecter spring bean Le cycle de vie est au centre de cet article

C'est aussi la réalisation de la pertinence BeanFactoryInterface, C'est une amélioration. BeanFactory, Est devenu lié à l'application ; C'est comme ajouter un menu à l'étage supérieur de la cuisine.

Par [email protected] @Component @Bean Ce sont des spécialités de leur design. , Pour les clients

Vous n'avez pas besoin de le décrire. ;

En fait, c'est vers le haut. BeanFactory Ajouter un postProcessor;

Nous devons juste savoir quand et où ajouter quoi postProcessor

AnnotationConfigServletWebServerApplicationContext

Les plus critiques et les plus couramment utilisées ApplicationContextNon.(spring boot web servletUtilisation environnementale)

Le plus souvent utilisé est ApplicationContext,spring boot servletUtilisation environnementale, Le leader mondial de la transformation des fruits de mer .

Diagramme de classe:

Cycle de vie

Notez que voici un exemple spring boot web servlet Environnement AnnotationConfigServletWebServerApplicationContext

(Clic droit- Nouvel onglet ouvert Vue agrandie )

Constructeur

ApplicationContextParspring bootCréation automatique, Le constructeur ajoute java configIl le faut.Processor

Ajouter

ConfigurationClassPostProcessor(BeanDefinitionRegistryPostProcessor)

Il scanne vers @SpringBootApplication Dans les notes @Import(AutoConfigurationImportSelector.class)

- Oui. spring.factoriesTout à l'intérieurAutoConfiguration Comme si @ConfigurationEffectuer un traitement analytique

EventListenerMethodProcessor(BeanFactoryPostProcessor)

Basé [email protected] Annotatedlistener Traitement des classes , Ajouter à la classe de diffusion d'événements

Ajouter

AutowiredAnnotationBeanPostProcessor(BeanPostProcessor)

CommonAnnotationBeanPostProcessor(BeanPostProcessor)

refresh

refresh La méthode comprend les sous - étapes suivantes:

prepareBeanFactory


  AjouterApplicationContextAwareProcessor(BeanPostProcessor)

  postProcessBeforeInitialization La méthode est utilisée pour awareInterface(SaufBeanNameAware、BeanClassLoaderAware、BeanFactoryAwareAu - delà) Assigner des attributs ici

  EnvironentAware

  …

  MessageSourceAware

  ApplicationContextAware

postProcessBeanFactory


  AjoutéWebApplicationContextServletContextAwareProcessor(BeanPostProcessor)

  PourServletContextAware、ServletConfigAware,Même chose.BeanFactoryAwareComment utiliser

invokeBeanFactoryPostProcessors


  1、Exécution de tous les projetsBeanDefinitionRegistryPostProcessor

  ConfigurationClassPostProcessor C'est ici que ça se passe.

  2、Exécution de tous les projetsBeanFactoryPostProcessor

   Toutes les collations ont priorité @PriorityOrderedNotes ouPriorityOrdered Mise en œuvre de l'interface de petite à grande

  Deuxièmement,@OrderedNotes ouOrdered Mise en œuvre de l'interface de petite à grande

   Enfin, le tri n'a pas été réalisé. (L'ordre n'est pas garanti)

registerBeanPostProcessors


  ToutBeanDefinition class typeOui.BeanPostProcessorDebeanTrouvez - le.,Ajouter àBeanFactory Pour son usage

initMessageSource


  c18nAutres

initApplicationEventMulticaster


  InitialisationApplicationContext Classe de diffusion d'événements pour , Peut être multithreadé ou synchrone , Synchronisation par défaut

onRefresh


  ServletWebServerApplicationContext (AnnotationConfigServletWebServerApplicationContextParent de)RéécritonRefresh Dans la méthode pour créer servletConteneur

registerListeners


  ToutlistenerDebean(Par exemple, la réalisationApplicationListenerInterfacebean) Inscription à la classe de diffusion d'événements , Utilisé pour déclencher ces événements lors d'une publication ultérieure listener

finishBeanFactoryInitialization


   Ça se déclenche ici. beanFactory.preInstantiateSingletons, C'est - à - dire le scrutin beanDefinitionEn coursbeanLe cycle de vie de

finishRefresh


  DémarragewebServer, Publier les événements pertinents

Ce qui a été ajouté à chaque lien , On revient. “Monde virtuel” Ajoutez quelques notes et consolidez - les.

Spring Boot De IOC

En fait, il n'y en a pas ici. DIC'est fait., Nous nous concentrons principalement sur la façon de nous connecter ApplicationContextLe cycle de vie de

Cycle de vie

De la source SpringApplication.run(xxx.class, args);Après être entré, C'est parti. spring bootLe cycle de vie de

Spring boot Le processus de démarrage pour Exécution du processus+ Conduite par l'événement , Où événementiel ,Oui.spring.factoriesÀ l'intérieur.Listener Pour déclencher l'écoute d'événements connexes ,spring boot web servlet Environnement par défaut ListenerVoici ce qui suit::

Spring boot Les événements correspondants sont publiés à chaque étape critique pour déclencher listenerParticipationspring bootLe processus de construction de, Le cycle de vie global est le suivant: :

Les éléments clés sont sur la photo. (Clic droit- Nouvel onglet ouvert Vue agrandie )

starting


   Principalement déclenché listener Initialisation des composants du Journal de tiers , Pour les réglages ultérieurs level groupAttendez.

  An ApplicationStartingEvent is sent at the start of a run but before any processing, except for the registration of listeners and initializers.

environmentPrepared


   Principales étapes ,spring.application.profile C'est cette étape qui déclenche listenerPour charger

   Publier ici eventDéclencheurlistener Pour charger la correspondance profileDe properties yaml Fichier àenvironment

  An ApplicationEnvironmentPreparedEvent is sent when the Environment to be used in the context is known but before the context is created.

  printBanner

  ImprimerbannerInformation

  createApplicationContext

   C'est juste là. ApplicationContext Sur la cohésion du constructeur

  ApplicationContextInitializer.initialize(context)

  PourApplicationContext Alimentation

contextPrepared


  An ApplicationContextInitializedEvent is sent when the ApplicationContext is prepared and ApplicationContextInitializers have been called but before any bean definitions are loaded.

contextLoaded


  An ApplicationPreparedEvent is sent just before the refresh is started but after bean definitions have been loaded.

  refreshContext

  EntréeApplicationContext.refresh()Méthodes

started


  An ApplicationStartedEvent is sent after the context has been refreshed but before any application and command-line runners have been called.

  ApplicationRunner

  L'appel est implémentéApplicationRunnerInterfacebean,Et l'appelerrunMéthodes

  L'appel est implémentéApplicationRunnerInterfacebean,Et l'appelerrunMéthodes

  CommandLineRunner

  L'appel est implémentéCommandLineRunnerInterfacebean,Et l'appelerrunMéthodes

running


  An ApplicationReadyEvent is sent after any application and command-line runners have been called.

failed


  An ApplicationFailedEvent is sent if there is an exception on startup.

C'est écrit à la fin. :

Il est difficile de créer un article , Il a fallu beaucoup de temps libre et d'énergie à l'auteur , Si ça vous aide, faites des recommandations. + Avant.

Spring IOC Container Plus d'articles sur l'analyse des principes

  1. Spring IOCAnalyse des principes de conception: Cet article est venu à titre de référence.

    Spring IOCAnalyse des principes de conception: Cet article est venu à titre de référence. Un.. Qu'est - ce queIoc/DI? 2.. Spring IOCArchitecture (1) BeanFactory (2) BeanDefinition Trois. I ...

  2. Spring IoCPrincipe de base

    -------------------siwuxie095                                 Spring IoC Principe de base         1.IoC C'est - à - dire: Invers ...

  3. Spring Boot Analyse du principe de démarrage

    Spring Boot Analyse du principe de démarrage http://www.cnblogs.com/moonandstar08/p/6550758.html Préface Nous avons vu les chapitres précédents SpringBoot Configuration automatique pour nous ...

  4. SpringSérie(Trois):Spring IoCAnalyse du code source

    Un..SpringDiagramme d'héritage des classes de conteneurs 2..Préparation préliminaire des conteneurs IoCPortail d'analyse des sources: /** * @desc: iocAnalyse des principes Démarrage * @author: toby * @date: 2019/7/22 22:20 ...

  5. Spring IoC ContainerAnalyse des sources(2.)-beanProcessus d'initialisation

    Préparez - vous. PersonExemple @Data public class Person { private String name; private int age; } xml beanConfiguration <?xml ...

  6. spring ioc aop Principes

    spring ioc aop Principes spring ioc aop Le principe springDeIoCLe conteneur estspringAu cœur de,spring AOP- Oui.springÉléments essentiels du cadre. Dans la programmation traditionnelle ,Tune ...

  7. Spring IoC Container and Spring Bean Example Tutorial

    Spring Framework is built on the Inversion of Control (IOC) principle. Dependency injection is the t ...

  8. Spring IoCAnalyse du code sourceinvokeBeanFactoryPostProcessors

    Un..BeanPost - processeur de l'usine BeanPost - processeur de l'usine:BeanFactoryPostProcessor(Temps de déclenchement:bean Après la définition de l'inscription beanAvant d'instancier)EtBeanDefinitionRegistr ...

  9. Spring IoCAnalyse du code sourcegetBean

    Un.. Instancie toutes les instances individuelles chargées non paresseuses Bean Deorg.springframework.context.support.AbstractApplicationContext#refresh Élaboration de méthodes ,Entrée dans ...

  10. Spring IOC Container

    All the notes are from Spring Framework 5 Doc. Un..Introduction to the Spring IOC Container and Beans ...

Recommandation aléatoire

  1. CentOSEn bas.yumInstallationLAMP

    1. AvecyumInstallationApache,Mysql,PHP. 1.1InstallationApache yum install httpd httpd-devel Une fois l'installation terminée,Avec/etc/init.d/httpd start  ...

  2. linux Transfert de données entre différents serveurs (rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)

    linux Transfert de données entre différents serveurs (rcp,scp,rsync,ftp,sftp,lftp,wget,curl) Classification: linux2011-10-10 13:21 8773Lecture humaine Commentaires(1) Collection Lève ...

  3. Aucune connaissance de base n'est nécessaire , C'est un chinois. !Let`s go!!!

    Sinification? N'aie pas peur de ces mots. . En fait, tu peux aussi être chinois. , Suivez mes pas. , Vous pouvez aussi faire la sinification ,Let`s go!!!( Les grands oiseaux passent ) Voici l'outil de gestion de la configuration de Microsoft Enterprise Class Library EntLibConfig.exe.Bien sûr.,Ici. ...

  4. C'est exact.luaSuccessionself.__index = self Une explication

    Regardez d'abord lua Processus de recherche d'une clé dans le tableau : -- Lorsque le tableau suivant t Clé de recherche moyenne kHeure,luaLe traitement est le suivant:: -- 1.tOui Nonk, Oui, renvoie directement la valeur ,Sinon, par2Pas -- 2.t Y a - t - il un métatableau? , Aucun retournil, Oui. 3Pas -- ...

  5. VmodCAM Initialisation

    ; WIP Last Changed Rev: 2172 ;********************************************************************** ...

  6. POJ 2318 TOYS &amp;&amp; POJ 2398 Toy Storage(Géométrie)

    2318 TOYS 2398 Toy Storage Titre : Voilà.n Coordonnées du bloc ,m Coordonnées spécifiques des jouets ,2318 La plaque moyenne est ordonnée ,Et2398 Le désordre doit être trié par lui - même ,2318 La sortie requise est le nombre de jouets dans chaque section ,Et231 ...

  7. OracleVoirLogMinerUne explication détaillée de

    Oracle Il existe de nombreuses façons de voir les journaux dans la base de données ,Nous pouvons nous baser surSQLDéclarations à mettre en œuvre, Les outils de visualisation des journaux sont également disponibles LogMinerPour réaliser, Dans cet article, nous présentons principalement le processus ,Alors, voyons voir.        Un..Or ...

  8. MacSuivant./usr/includeDisparu

    MacMise à jour versYosemiteAprès,Je l'ai découvert.vimDeYouCompleteMe Le Code invite donc les membres du chèque vide , J'ai vérifié. ,À l'origine/usr/include Manquant dans le Répertoire .Tous lesC/C++ Le fichier d'en - tête a disparu. . .. Première découverte ...

  9. En brefWindowsEnvironnementDOSEtMS-DOS Et une introduction aux commandes communes

    En brefWindowsEnvironnementDOSEtMS-DOS Et une introduction aux commandes communes Notes antérieures Je suis programmeur. , D'abord, je suis un débutant. , Ça fait si longtemps qu'on a accès à l'ordinateur. , J'ai l'impression que la technologie et les connaissances informatiques sont floues. . Flou , On dirait que c'est un peu trop drôle. :Bureau ...

  10. Sauvegarde simple mysqlBase de données

    Pour les scénarios d'affaires avec peu de données , Vous pouvez faire des sauvegardes complètes tous les jours . Mode de réalisation: Script de base de données de sauvegarde ,Et aprèscrontab Exécuter des scripts de sauvegarde tous les jours . Exemple de script de sauvegarde : #!/bin/bash #Author: zhangsa ...