Cet article résume principalement certaines méthodes de rappel et points extensibles fournis par le conteneur de printemps avant et après l'initialisation de l'instance. En utilisant ces méthodes et points d'extension, un traitement logique spécial peut être effectué avant et après les instances d'initialisation du ressort.
Ce qui suit est principalement introduit:
Méthode d'initialisation du cycle de vie au niveau de la classe Configuration de la méthode d'initialisation, interface d'initialisation et annotation post-contrainte
Interface de retenue au niveau du conteneur BeanPostprocessor et interface beanfactoryPostProcessor
1. Rappel du cycle de vie au niveau de la classe
1,1In-méthode
Référence: SpringbeanxsDinit-Method
Init-Method est un élément de configuration lors de la déclaration d'un bean dans le fichier de configuration de ressort. La valeur de l'élément de configuration init-méthode est une méthode sans paramètre dans la classe, mais une exception peut être lancée. Cette méthode sera appelée une fois que le conteneur de ressort a instancié l'objet et définira la valeur de la propriété.
Les fonctions qui peuvent être implémentées par init-méthode sont cohérentes avec l'interface InitializingBean et l'annotation postconstructrice
Les fichiers de configuration de Spring et les classes de test sont les suivants:
<bean id = "initMethodBeanService" init-méthod = "init"> <propriété name = "f2" value = "2" /> </bant>
La classe de test est la suivante:
classe publique InitMethodBeanService {entier statique privé F1; entier privé F2; statique {f1 = 1; System.out.println ("IniTMethodbeanService Static Block EXECUTE ...");} public InitMethoDBeanService () {System.out.Println ("InitMethodbeanService Construct Method Entar init () {System.out.println ("initMethodBeanService Méthode init exécution ...");} public Integer getF2 () {return f2;} public void setf2 (INTER F2) {this.f2 = f2; System.out.println ("initMethodbeanService setf2 méthode exécute ...");}}Les résultats de l'exécution sont imprimés comme suit:
IniTMethodBeanService Static Block Execute ... INITMETHODBEANSERVICE Méthode de construction EXECUTE ... INITMETHODBEANSERVICE Setf2 Méthode EXECUTE ... INITMETHODBEANSERVICE Méthode Init EXECUTE ... Méthode de test EXECUTE ...
1.2InitializingBean Interface
Référence: Document officiel du printemps Beans-Factory-LifeCycle-InitializingBean
Une interface InitializingBean déclare une méthode AfterPropertiseSet, qui est appelée après que le conteneur de ressort instancie l'objet et définit la valeur de propriété. Il est cohérent avec les fonctionnalités implémentées ci-dessus, donc Spring ne recommande pas d'utiliser l'interface InitializingBean.
L'exemple est relativement simple, pas répertorié
Annotation de 1,3postconstruct
Traduction: Document officiel du printemps HEARS-POSTCONSTRUCT-and-Prestroy-Annotations
@PostConstruct Annotation est une méthode de rappel du cycle de vie qui est cohérente avec la mise en œuvre des interfaces d'initialisation et d'initialisation de laBe.
@PostConstructPublic void PostConstruct () {System.out.println ("PostConstructService PostConstruct Method Execute ...");}Résumez les trois méthodes de rappel du cycle de vie ci-dessus IniT-Method, InitializingBean Interface, @postConstruct Annotation
1. Tous sont instanciés et post-traités pour les classes uniques
2. Le temps d'exécution est appelé après l'instanciation de classe et les variables membre sont injectées.
3. Pour init-méthod, vous pouvez également configurer la méthode d'initialisation par défaut sous l'élément Beans du fichier de configuration Spring, et l'élément de configuration est par défaut-init-méthode
4. Si les méthodes d'initialisation configurées dans les trois méthodes ci-dessus sont différentes, l'ordre d'exécution est: @postConstruct Annotation Method> InitializingBean's AfterProperTeset> Init-Method Method; Si les méthodes configurées dans les trois méthodes sont les mêmes, la méthode ne sera exécutée qu'une seule fois (reportez-vous à: le document officiel de printemps Beans-Factory-LifeCycle-Combind-Effet)
5. Il existe une méthode de rappel initiale, et il existe également une méthode de rappel détruite. @PostConstruct Annotation Method> InitializingBean's AfterProperTesET> Les méthodes d'init-méthode correspondent à la méthode d'annotation @predestroy> DisposableBean's Détroo> Méthode de détruire
2. Extension de niveau de conteneur
Traduction: Document officiel du printemps 3.8 ContaineRextension Points
D'une manière générale, les développeurs n'ont pas besoin de personnaliser une sous-classe d'ApplicationContext pour étendre les conteneurs SpringIoc. Les conteneurs SpringIoc peuvent réaliser l'extension des conteneurs SpringIoc via certaines interfaces exposées.
2.1 Interface de CEAnPostProcessor
2.1.1 Initialisation de l'instance de baisse de la chaîne post-processeur et post-processeur
L'interface BeanPostProcessor définit deux méthodes de rappel au niveau des conteneurs postprocessBeforesinitialisation et postprocessafterinitialisation, qui sont utilisées pour un traitement logique après l'initialisation de l'instance et seront traités pour toutes les instances du conteneur. La classe qui implémente l'interface BeanPostProcessor est appelée le postprocesseur d'initialisation d'instance de bean.
Si les postprocesseurs d'initialisation de plusieurs instances sont intégrés dans des conteneurs SpringIoc, l'ensemble de ces postprocesseurs est appelé chaîne postprocesseur d'initialisation d'instance Bean.
La méthode postprocessbeforesinitialisation est exécutée une fois l'instanciation de classe et l'injection de variables de membre est terminée, et avant la méthode d'initialisation (comme l'initialisation de la méthode AfterProperESTET de Bializean)
La méthode postprocessaftérimialisation est exécutée une fois l'instanciation de classe et l'injection de variable de membre est terminée, et la méthode d'initialisation (comme la méthode AfterProperESet de l'initialisation
Résumer:
1. Le post-processeur d'initialisation de l'instance est principalement utilisé pour certaines opérations de proxy sur l'instance. Certaines fonctionnalités qui utilisent AOP au printemps sont également implémentées via des post-processeurs.
2. La chaîne post-processeur d'initialisation de l'instance est plusieurs post-processeurs, et il y aura des problèmes avec l'ordre d'exécution. Vous pouvez implémenter l'interface commandée pour spécifier l'ordre d'exécution du post-traitement. L'interface commandée déclare la méthode Getorder. Plus la valeur de retour de la méthode est petite, plus la priorité de la post-traitement est élevée et plus d'exécution antérieure.
3. Lors de l'initialisation du postprocesseur en implémentant l'interface BeanPostProcessor, il est recommandé d'implémenter l'interface commandée et de spécifier la priorité.
4. La portée de ces post-processeurs est le conteneur SpringIoc actuel, c'est-à-dire le conteneur SpringIoc que le post-processeur est déclaré. Pour les conteneurs SpringIoc avec des structures hiérarchiques, la chaîne de processeur après l'initialisation de l'instance n'agit pas sur l'instance initialisée par d'autres conteneurs, même si les deux conteneurs sont sur la même hiérarchie.
5. La classe d'implémentation de l'initialisation d'instance post-processeur ne doit être déclarée de la même manière que les haricots gérés par le ressort ordinaires. Le conteneur SpringIoc le détectera automatiquement et l'ajoutera à la chaîne post-processeur d'initialisation de l'instance.
6. Par rapport à la détection automatique, nous pouvons également appeler la méthode AddBeanPostProcessor de ConfigurableBeanFactory pour ajouter par programme un post-processeur d'initialisation d'instance à la chaîne post-processeur d'initialisation de l'instance. Ceci est plus pratique dans les scénarios où l'ajout de conditions doit être déterminé. Cette approche de programmation ignore l'ordre spécifié par l'interface ordonnée implémentée, mais agira sur toutes les instances qui sont automatiquement détectées avant l'initialisation du post-processeur.
2.1.2 Initialisation d'instance de haricot postprocesseur et AOP
BeanPostProcessor est une interface spéciale, et la classe implémentant cette interface sera utilisée comme postprocesseur pour les cas de haricots à ressort. Par conséquent, dans une étape spéciale du démarrage du contexte d'application de printemps, toutes les instances qui implémentent l'interface BeanPostProcessor seront directement initialisées, et les classes référencées par l'instance seront également instanciées. Ensuite, en tant que postprocesseur, de postuler à d'autres instances normales.
Étant donné que le proxy automatique d'AOP est implémenté sous la forme d'instanciation de postprocesseurs, ni l'instance Bean n'initialise l'instance de chaîne post-processeur ni son instance référencée ne peut être automatiquement proxyée. Par conséquent, ne tissez pas le visage sur ces exemples. (Pour ces instances, un message de journal sera généré: "La classe FOO ne peut pas être traitée par toutes les chaînes postprocesseurs instanciées, c'est-à-dire ne peut pas être automatiquement proxyée").
Remarque: Lorsque le post-processeur d'instanciation fait référence à d'autres haricots sous forme de automatiquement ou @Resource, le conteneur de ressort peut injecter des haricots non spécifiés lorsqu'il est injecté avec une dépendance correspondante de type (par exemple, la base d'instanciation post-processeur dépend de la forme de ressources. être injecté sous forme de correspondance de type et un haricot non spécifié peut être injecté à ce moment). Cela peut également entraîner l'échec de l'échec de la proxie automatique ou d'autres méthodes d'instanciation.
2.1.3 Exemple d'initialisation de l'instance de bean postprocesseur
classe publique BeanPostProcessorService implémente BeanPostProcessor {@Override Objet public postprocessafterinitialization (objet O, String S) lève BeanSexception {System.out.println ("BeanPostProcessorService Postprocessafterinitialization Méthode d'exécution ..."); Retour O;} @ overde Object Public Object PostProcessbeforefore BeanSexception {System.out.println ("BeanPostProcessorService PostProcessBeforeInitialization Execute ..."); retour o;}}2.2BEANFACTORYPOSTPROCESSEUR
2.2.1 Post-processeur de haricot
En implémentant l'interface BeanFactoryPostProcessor, vous pouvez lire les métadonnées de configuration des haricots gérés par le conteneur et apporter des modifications avant l'instanciation du haricot. Ces haricots sont appelés postprocesseurs de haricots.
Similitudes et différences entre les prestations de prestations de présentations et les interfaces BeanPostProcessor:
Similitudes:
Tous sont des postprocesseurs au niveau des conteneurs
Tous peuvent être configurés avec plusieurs postprocesseurs, et l'ordre d'exécution est spécifié en implémentant l'interface commandée.
Ils sont traités pour les haricots gérés dans des conteneurs déclarés par les interfaces. Dans les conteneurs avec des structures hiérarchiques, les haricots dans d'autres conteneurs ne peuvent pas être traités, même si les deux conteneurs sont au même niveau.
Tous doivent seulement être déclarés dans le conteneur comme des haricots ordinaires. Le conteneur détectera et s'inscrira automatiquement en tant que post-processeur.
La configuration de la propriété d'initialisation de retard sera ignorée
Différences:
L'interface deprocesseurs BeanfactoryPosts traite les métadonnées de configuration du haricot avant l'instanciation des haricots, et l'interface dupostprocesseur traite l'instance du haricot après l'instanciation des haricots **
L'interface BeanfactoryPostProcessors peut également obtenir une instance de bean via la méthode beanfactory.getBean (), ce qui entraînera l'instanciation du bean. Étant donné que le post-processeur de BeanfactoryPostprocessors est exécuté avant que tous les haricots ne soient instanciés, la méthode beanfactory.getBean () entraînera l'instanciation du bean à l'avance, la rupture du cycle de vie de la norme du conteneur, ce qui peut provoquer des impacts négatifs (par exemple, le haricot instancié à l'avance ignorera le traitement du haricot post-processeur instancié).
2.2.2 Spring intégrée et post-professionnel du haricot personnalisé
Spring a des postprocesseurs Beanfactory intégrés (par exemple: PropertyPlaceHolderConfigurer et PropertyOverRideConfigurer). Il prend également en charge la mise en œuvre de l'interface BeanfactoryPostProcessor et personnalise le postprocessor Beanfactory. Parlons des postprocesseurs intégrés de Spring et des postprocesseurs personnalisés.
PropertyPlaceholder Configurer
Afin d'éviter les risques causés par la modification du fichier de définition XML principal, Spring fournit une séparation de configuration et peut configurer certaines variables qui peuvent être modifiées dans le fichier de configuration de la propriété et la référencer dans le fichier de définition XML en tant qu'ensembles d'espace réservé. De cette manière, la modification de la configuration nécessite uniquement de modifier le fichier de configuration d'attribut. PropertyPlaceHolderConfigurer est utilisé pour détecter les espaces réservés et remplacer les espaces réservés par des valeurs de propriété de configuration. Les exemples sont les suivants:
PropertyPlaceHolderConfigurer utilise le fichier de configuration de la propriété JDBC.Properties pour remplacer l'espace réservé de la propriété pour les informations liées à la base de données dans le bean de données de données par la valeur de configuration correspondante à l'exécution.
La configuration XML est la suivante:
<Ean> <propriété name = "Locations" value = "classPath: com / foo / jdbc.properties" /> </ bean> <bean id = "dataSource" destrement-Method = "close"> <propriété name = "DriverClassName" value = "$ {jdbc.DiverClassName}" /> <propriété name = "url" value = "$ {jdbc. <propriété name = "username" value = "$ {jdbc.Username}" /> <propriété name = "mot de passe" value = "$ {jdbc.password}" />Le fichier de configuration d'attribut JDBC.Properties est le suivant:
jdbc.DriverClassName = org.hsqldb.jdbcdriverjdbc.url = jdbc: hsqldb: hsql: // Production: 9002jdbc.Username = sajdbc.Password = root
PropertyPlaceHolderConfigurer prend non seulement en charge la lecture des fichiers de configuration de la propriété, mais prend également en charge la lecture des propriétés du système. La priorité de lecture peut être configurée via la valeur de propriété SystemPropertiesMode. Les différentes valeurs sont décrites comme suit:
0: Ne lisez pas les propriétés du système
1: Si la configuration de l'espace réservé correspondant n'est pas récupérée dans le fichier de configuration d'attribut référencé, l'attribut système est lu. La valeur par défaut est 1
2: Lisez d'abord les attributs du système, puis lisez le fichier de configuration d'attribut référencé. Cette configuration peut entraîner l'écrasement des propriétés du système pour écraser le fichier de configuration.
PropertyOverrideConfigurer
La classe PropertyOverRideConfigurer peut attribuer directement des valeurs aux beans dans le conteneur en se référant au fichier de configuration de la propriété. Lorsque la propriété d'un bean est attribuée par plusieurs instances de classe PropertyOverRideConfigurer, la dernière valeur l'emporte sur la précédente.
Attribuer le bean de source de données ci-dessus à titre d'exemple:
La classe PropertyOverRideConfigurer utilise une nouvelle façon de référencer le fichier de configuration de la propriété, comme suit:
<Context: Property-Override Location = "ClassPath: Override.Properties" />
Les règles de nommage des propriétés de dépassement. Le fichier de configuration de la propriété des propriétés est différent de ceux ci-dessus (dans l'exemple ci-dessus, il est nécessaire de s'assurer que le nom de la propriété et le logement sont cohérents), et les règles de dénomination sont Beanname.Property
DataSource.DriverClassName = com.mysql.jdbc.DriverDataSource.url = jdbc: mysql: mydbdatasource.username = sadatasource.password = root =
Prend en charge l'attribution des attributs composites, mais garantit que l'objet qui fait référence à l'attribut attribué n'est pas vide, par exemple: foo.fred.bob.sammy = 123
Post-processeur d'usine de haricots personnalisés
Le postprocesseur de foyer de bean personnalisé implémente l'interface beanfactoryPostProcessor pour compléter la modification des métadonnées de configuration du bean géré par le conteneur de printemps. Par exemple: modifiez la valeur injectée par les attributs de classe, l'exemple est le suivant:
Définir une classe d'utilisateur Userbean
classe publique UserBean {private String username; public String getUserName () {return username;} public void SetUserName (String username) {this.userName = username;}}Le fichier de configuration Spring XML configure la classe utilisateur et injecte la valeur haha au nom d'utilisateur de l'attribut de nom d'utilisateur
<Bean /> <bean id = "user"> <propriété name = "username" value = "haha" /> </ bean>
Vous trouverez ci-dessous un postprocesseur de farine de haricot personnalisé, modifiez la valeur du nom d'utilisateur de la propriété à Heihei
Classe publique BeanFactoryPostProcessorService implémente BeanFactoryPostProcessor {@Override public void PostProcessBeanFactory (ConfigurableListableBeanFactory Beanfactory) lève BeanSexception {System.out.println ("beanfactoryPostProceCSORSSORSSSORSSPRESSBEANFACTORY Method Exécute ..."); BeanDefinition bd = beanfactory.getBeAndefinition ("utilisateur"); MutablepropertyValues pv = bd.getPropertyValues (); if (pv.Contains ("nom d'utilisateur")) {pv.addpropertyValue ("nom d'utilisateur", "heihei"); }}}Résumer
Ce qui précède est toute l'explication détaillée des rappels du cycle de vie printanier et des extensions de conteneurs dans cet article. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à ce site:
Une brève discussion sur l'application des annotations personnalisées au printemps
Analyse du code IOC de Spring
Exemple de code d'utilisation de SpringMVC Interceptor HandlerInterceptor
S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!