Modifier et construire le code source de Spring-Framework

Dans le processus d'apprentissage de Spring, c'est une bonne méthode d'apprentissage pour modifier le code source et vérifier les résultats. C'est un bon moyen de vous impressionner. Aujourd'hui, je vais modifier le code source de Spring-Framework, puis compiler et construire, et enfin écrire un projet de démonstration Vérifier la réussite de la construction;

Informations environnementales

Les versions impliquées dans le combat réel sont les suivantes:

  1. Système d'exploitation: win10 64;

  2. JDK: 1.8.0_144 ;

  3. Maven : 3.5.0 ;

  4. IntelliJ IDEA: 2018.1.5 (Ultimate Edition) ;

Résumé en texte intégral

Toutes les étapes de ce combat sont les suivantes:

  1. Téléchargez le code source spring-framwork et utilisez IDEA pour ouvrir le projet;

  2. Modifiez la classe dans Spring-Framework et ajoutez du code;

  3. Compilez et construisez Spring-Framework, ajoutez-le au référentiel Maven local;

  4. Créer une nouvelle démo basée sur maven, en utilisant le cadre de ressort de l'entrepôt local;

  5. Exécutez le projet de démonstration pour vérifier que le code modifié a pris effet;

Commençons le combat proprement dit;

Téléchargez le code source de Spring-Framework et utilisez IDEA pour ouvrir le projet

  1. Ouvrez la liste des versions de Spring-Framework sur GitHub à https://github.com/spring-projects/spring-framework/releases, téléchargez la version 4.1.8.RELEASE, comme indiqué dans l'encadré rouge ci-dessous:

  2. Après la décompression, utilisez Intellij IDEA pour importer sous forme de projet Gradle. La version Gradle, n'oubliez pas d'utiliser 2.14.1, comme indiqué ci-dessous:

Modifier la classe dans Spring-Framework

La classe modifiée cette fois est PropertyPlaceholderHelper.java. Cette classe est utilisée pour remplacer les espaces réservés dans la chaîne. Le but de cette modification du code source est le suivant:

  1. Imprimez les chaînes avant et après remplacement pour comparaison;

  2. Imprimez la pile d'appels, afin que lorsque nous apprenons le code source du ressort, nous puissions connaître le moment et l'emplacement des espaces réservés;

Les modifications spécifiques apportées à PropertyPlaceholderHelper.java sont les suivantes:

  1. Ajout d'une méthode privée pour imprimer la position actuelle de la pile:

private void printTrack(String prefix){
	StackTraceElement[] st = Thread.currentThread().getStackTrace();
	if(st==null){
		logger.info("invalid stack");
		return;
	}


	StringBuffer sbf =new StringBuffer();


	for(StackTraceElement e:st){
		if(sbf.length()>0){
			sbf.append(" <- ");
			sbf.append(System.getProperty("line.separator"));
		}
	
		sbf.append(java.text.MessageFormat.format("{0}.{1}() {2}"
					,e.getClassName()
					,e.getMethodName()
					,e.getLineNumber()));
	}
	logger.info(prefix + "\n" + sbf.toString());
}
  1. Recherchez la méthode parseStringValue , faites attention au type protégé, ajoutez les deux lignes de code suivantes au début de la méthode:

protected String parseStringValue(
			String strVal, PlaceholderResolver placeholderResolver, Set<String> visitedPlaceholders) {
	printTrack("start parseStringValue");
	logger.info("before parse : [" + strVal + "]");

Le code ci-dessus imprime d'abord la pile dans laquelle parseStringValue est appelée, puis imprime le paramètre d' entrée strVal ; 3. À la fin de la méthode parseStringValue à l'étape précédente, ajoutez une ligne de code avant de retourner pour imprimer la chaîne traitée, comme suit :

	logger.info("after parse : [" + result + "]");
	return result.toString();
}
  1. Afin d'empêcher d'autres projets sur l'ordinateur actuel d'utiliser la version Spring que nous avons créée, nous avons changé le numéro de version, ouvert le fichier gradle.properties et modifié le numéro de version en "4.1.88.RELEASE", comme suit:

version=4.1.88.RELEASE

Compiler et construire un framework de printemps

  1. Compilez et générez le projet avec la commande build -x test , l'opération est comme indiqué dans la figure ci-dessous:

  2. Après avoir attendu la fin de la génération, utilisez la commande install pour déployer le fichier jar intégré dans le référentiel maven local, comme indiqué ci-dessous:

  3. Accédez à l'entrepôt Maven local pour voir qu'il existe déjà des fichiers, comme indiqué ci-dessous:

Créer une démo, utiliser le cadre de printemps de l'entrepôt local

Créez une application java basée sur maven, voici les étapes:

  1. Le contenu de pom.xml est le suivant:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>


    <groupId>com.bolingcavalry</groupId>
    <artifactId>springcoredemo</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <!-- Spring framework -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.88.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.88.RELEASE</version>
        </dependency>
    </dependencies>


</project>
  1. Nouveau fichier: src / main / resources / applicationContext.xml, utilisé pour configurer le bean, le contenu est le suivant:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
 	http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">


    <beans>
        <bean class="com.bolingcavalry.bean.Simple"></bean>
    </beans>
</beans>
  1. Créez une classe: com.bolingcavalry.bean.Simple.java:

public class Simple {
    public void execute() {
        System.out.println("Simple execute method");
    }
}
  1. Créez la classe de démarrage com.bolingcavalry.DemoApplication.java:

public class DemoApplication {


    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("${CONFIG_PATH}");
        Simple bean = context.getBean(Simple.class);
        bean.execute();
        context.close();
    }
}

Notez qu'il existe une variable $ {CONFIG_PATH} dans le code ci - dessus, la valeur de cette variable n'est pas dans le code et le fichier de configuration, et est définie lors de son exécution; 5. Lors de l'exécution de DemoApplication.java, faites attention à la valeur de la variable d'environnement CONFIG_PATH, qui est dans IDEAL La méthode ci-dessus est la suivante, cliquez sur "Modifier les configurations ..." dans la case rouge:

  1. Comme illustré ci-dessous, cliquez sur le bouton dans la case rouge:

  2. Comme illustré ci-dessous, cliquez sur le signe plus dans la zone rouge, puis ajoutez une paire clé-valeur, le nom est "CONFIG_PATH", la valeur est "classpath: applicationContext.xml"

  3. Après la configuration, cliquez sur le bouton triangle vert dans la case rouge ci-dessous pour exécuter la méthode principale de DemoApplication, et les variables d'environnement qui viennent d'être définies prennent également effet:

  4. Les résultats sont les suivants:

C:\jdk\bin\java.exe -javaagent:C:\software\JetBrains\IntelliJIDEA\lib\idea_rt.jar=60748:C:\software\JetBrains\IntelliJIDEA\bin -Dfile.encoding=UTF-8 -classpath C:\jdk\jre\lib\charsets.jar;C:\jdk\jre\lib\deploy.jar;C:\jdk\jre\lib\ext\access-bridge-64.jar;C:\jdk\jre\lib\ext\cldrdata.jar;C:\jdk\jre\lib\ext\dnsns.jar;C:\jdk\jre\lib\ext\jaccess.jar;C:\jdk\jre\lib\ext\jfxrt.jar;C:\jdk\jre\lib\ext\localedata.jar;C:\jdk\jre\lib\ext\nashorn.jar;C:\jdk\jre\lib\ext\sunec.jar;C:\jdk\jre\lib\ext\sunjce_provider.jar;C:\jdk\jre\lib\ext\sunmscapi.jar;C:\jdk\jre\lib\ext\sunpkcs11.jar;C:\jdk\jre\lib\ext\zipfs.jar;C:\jdk\jre\lib\javaws.jar;C:\jdk\jre\lib\jce.jar;C:\jdk\jre\lib\jfr.jar;C:\jdk\jre\lib\jfxswt.jar;C:\jdk\jre\lib\jsse.jar;C:\jdk\jre\lib\management-agent.jar;C:\jdk\jre\lib\plugin.jar;C:\jdk\jre\lib\resources.jar;C:\jdk\jre\lib\rt.jar;D:\github\blog_demos\springcoredemo\target\classes;C:\Users\12167\.m2\repository\org\springframework\spring-core\4.1.88.RELEASE\spring-core-4.1.88.RELEASE.jar;C:\Users\12167\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\12167\.m2\repository\org\springframework\spring-context\4.1.88.RELEASE\spring-context-4.1.88.RELEASE.jar;C:\Users\12167\.m2\repository\org\springframework\spring-aop\4.1.88.RELEASE\spring-aop-4.1.88.RELEASE.jar;C:\Users\12167\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\12167\.m2\repository\org\springframework\spring-beans\4.1.88.RELEASE\spring-beans-4.1.88.RELEASE.jar;C:\Users\12167\.m2\repository\org\springframework\spring-expression\4.1.88.RELEASE\spring-expression-4.1.88.RELEASE.jar com.bolingcavalry.DemoApplication
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper printTrack
信息: start parseStringValue
java.lang.Thread.getStackTrace() 1,559 <- 
org.springframework.util.PropertyPlaceholderHelper.printTrack() 231 <- 
org.springframework.util.PropertyPlaceholderHelper.parseStringValue() 132 <- 
org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders() 126 <- 
org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders() 204 <- 
org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders() 178 <- 
org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders() 571 <- 
org.springframework.context.support.AbstractRefreshableConfigApplicationContext.resolvePath() 122 <- 
org.springframework.context.support.AbstractRefreshableConfigApplicationContext.setConfigLocations() 80 <- 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>() 137 <- 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>() 83 <- 
com.bolingcavalry.DemoApplication.main() 14
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper parseStringValue
信息: before parse : [${CONFIG_PATH}]
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper printTrack
信息: start parseStringValue
java.lang.Thread.getStackTrace() 1,559 <- 
org.springframework.util.PropertyPlaceholderHelper.printTrack() 231 <- 
org.springframework.util.PropertyPlaceholderHelper.parseStringValue() 132 <- 
org.springframework.util.PropertyPlaceholderHelper.parseStringValue() 148 <- 
org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders() 126 <- 
org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders() 204 <- 
org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders() 178 <- 
org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders() 571 <- 
org.springframework.context.support.AbstractRefreshableConfigApplicationContext.resolvePath() 122 <- 
org.springframework.context.support.AbstractRefreshableConfigApplicationContext.setConfigLocations() 80 <- 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>() 137 <- 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>() 83 <- 
com.bolingcavalry.DemoApplication.main() 14
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper parseStringValue
信息: before parse : [CONFIG_PATH]
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper parseStringValue
信息: after parse : [CONFIG_PATH]
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper printTrack
信息: start parseStringValue
java.lang.Thread.getStackTrace() 1,559 <- 
org.springframework.util.PropertyPlaceholderHelper.printTrack() 231 <- 
org.springframework.util.PropertyPlaceholderHelper.parseStringValue() 132 <- 
org.springframework.util.PropertyPlaceholderHelper.parseStringValue() 165 <- 
org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders() 126 <- 
org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders() 204 <- 
org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders() 178 <- 
org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders() 571 <- 
org.springframework.context.support.AbstractRefreshableConfigApplicationContext.resolvePath() 122 <- 
org.springframework.context.support.AbstractRefreshableConfigApplicationContext.setConfigLocations() 80 <- 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>() 137 <- 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>() 83 <- 
com.bolingcavalry.DemoApplication.main() 14
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper parseStringValue
信息: before parse : [classpath:applicationContext.xml]
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper parseStringValue
信息: after parse : [classpath:applicationContext.xml]
七月 07, 2018 7:18:14 下午 org.springframework.util.PropertyPlaceholderHelper parseStringValue
信息: after parse : [classpath:applicationContext.xml]
七月 07, 2018 7:18:14 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@20ad9418: startup date [Sat Jul 07 19:18:14 GMT+08:00 2018]; root of context hierarchy
七月 07, 2018 7:18:14 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
七月 07, 2018 7:18:14 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@20ad9418: startup date [Sat Jul 07 19:18:14 GMT+08:00 2018]; root of context hierarchy
Simple execute method


Process finished with exit code 0

Dans les résultats ci-dessus, nous pouvons voir les informations de la pile, qui peuvent refléter l'appel de la méthode lors de l'exécution. En outre, avant l'analyse et après l'analyse reflètent les modifications de la chaîne avant et après l'analyse. Quant à savoir pourquoi la pile est imprimée plusieurs fois, c'est parce que parseStringValue La méthode elle-même est appelée de manière itérative et sera imprimée à chaque fois, ce qui peut également être vu à partir des informations de la pile (parseStringValue () 148);

Le code source de cette démo peut être téléchargé à partir de github. Les informations d'adresse et de lien sont indiquées dans le tableau ci-dessous:

Le nom Lien Remarques
Page d'accueil du projet https://github.com/zq2599/blog_demos La page d'accueil du projet sur GitHub
adresse du référentiel git (https) https://github.com/zq2599/blog_demos.git L'adresse de l'entrepôt du code source du projet, protocole https
adresse du référentiel git (ssh) [email protected]: zq2599 / blog_demos.git L'adresse d'entrepôt du code source du projet, protocole ssh

Il y a plusieurs dossiers dans ce projet git. Le code source de ce chapitre se trouve dans le dossier springcoredemo, comme indiqué dans l'encadré rouge ci-dessous:

À ce stade, le combat réel pour modifier le code source de Spring-Framwork est terminé. J'espère que vous pourrez également modifier et créer vos propres lieux d'intérêt lors de l'apprentissage de Spring-Framwork. J'espère que cet article peut vous donner une référence;

Publié 376 articles originaux · loué 986 · 1,28 million de vues

Je suppose que tu aimes

Origine blog.csdn.net/boling_cavalry/article/details/105384287
conseillé
Classement