Modifique e construa o código-fonte do framework spring

No processo de aprendizado da primavera, é um bom método de aprendizado modificar o código-fonte e verificar os resultados. É uma boa maneira de se impressionar. Hoje vou modificar o código-fonte do framework spring, compilar e construir e, finalmente, escrever um projeto de demonstração. Verificar construção bem-sucedida;

Informação ambiental

As versões envolvidas no combate real são as seguintes:

  1. Sistema operacional: win10 64;

  2. JDK: 1.8.0_144 ;

  3. Maven : 3.5.0 ;

  4. IntelliJ IDEA: 2018.1.5 (Edição Ultimate) ;

Resumo do texto completo

Todas as etapas deste combate real são as seguintes:

  1. Faça o download do código-fonte do spring-framwork e use o IDEA para abrir o projeto;

  2. Modifique a classe no spring-framework e adicione código;

  3. Compile e construa spring-framework, adicione ao repositório maven local;

  4. Crie uma nova demonstração baseada em maven, usando a estrutura de mola do armazém local;

  5. Execute o projeto de demonstração para verificar se o código modificado entrou em vigor;

Vamos começar o combate real;

Faça o download do código-fonte do framework spring e use o IDEA para abrir o projeto

  1. Abra a lista de versões do spring-framework no GitHub, o endereço é: https://github.com/spring-projects/spring-framework/releases, faça o download da versão 4.1.8.RELEASE, conforme mostrado na caixa vermelha abaixo:

  2. Após a descompressão, use o Intellij IDEA para importar na forma de projeto Gradle.A versão Gradle lembre-se de usar 2.14.1, como mostrado abaixo:

Modifique a classe no framework Spring

A classe modificada dessa vez é PropertyPlaceholderHelper.java. Essa classe é usada para substituir os espaços reservados na cadeia de caracteres.O objetivo dessa modificação do código-fonte é o seguinte:

  1. Imprima as strings antes e depois da substituição para comparação;

  2. Imprima a pilha de chamadas, para que, quando aprendermos o código fonte da primavera, possamos saber o tempo e a localização dos espaços reservados;

As modificações específicas no PropertyPlaceholderHelper.java são as seguintes:

  1. Adicionado um método privado para imprimir a posição atual da pilha:

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. Encontre o método parseStringValue , preste atenção ao tipo protegido, adicione as duas linhas de código a seguir no início do método:

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

O código acima primeiro imprime a pilha onde parseStringValue é chamado e, em seguida, imprime o parâmetro de entrada strVal ; 3. No final do método parseStringValue na etapa anterior, adicione uma linha de código antes de retornar para imprimir a sequência processada, da seguinte maneira :

	logger.info("after parse : [" + result + "]");
	return result.toString();
}
  1. Para impedir que outros projetos no computador atual usem a versão de primavera que criamos, alteramos o número da versão, abrimos o arquivo gradle.properties e modificamos o número da versão para "4.1.88.RELEASE", da seguinte maneira:

version=4.1.88.RELEASE

Compilar e construir Spring-Framework

  1. Compile e construa o projeto com o comando build -x test , a operação é mostrada na figura abaixo:

  2. Depois de aguardar a conclusão da construção, use o comando install para implantar o jar construído no repositório maven local, como mostrado abaixo:

  3. Vá para o armazém local do maven para ver, já existem arquivos, como mostrado abaixo:

Crie uma demonstração, use a estrutura de mola do armazém local

Crie um aplicativo java baseado no maven, a seguir estão as etapas:

  1. O conteúdo do pom.xml é o seguinte:

<?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. Novo arquivo: src / main / resources / applicationContext.xml, usado para configurar o bean, o conteúdo é o seguinte:

<?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. Crie uma classe: com.bolingcavalry.bean.Simple.java:

public class Simple {
    public void execute() {
        System.out.println("Simple execute method");
    }
}
  1. Crie a classe de inicialização 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();
    }
}

Observe que há uma variável $ {CONFIG_PATH} no código acima, o valor dessa variável não está no arquivo de código e configuração e é definido quando é executado; 5. Ao executar o DemoApplication.java, preste atenção ao valor da variável de ambiente CONFIG_PATH, que está em IDEAL O método acima é o seguinte, clique em "Editar configurações ..." na caixa vermelha:

  1. Como mostrado abaixo, clique no botão na caixa vermelha:

  2. Como mostrado abaixo, clique no sinal de mais na caixa vermelha e adicione um par de valores-chave. Nome é "CONFIG_PATH", Valor é "caminho de classe: applicationContext.xml"

  3. Após a configuração, clique no botão triângulo verde na caixa vermelha abaixo para executar o método principal do DemoApplication, e as variáveis ​​de ambiente que acabaram de ser definidas também entram em vigor:

  4. Os resultados são os seguintes:

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

Nos resultados acima, podemos ver as informações da pilha, que podem refletir a chamada do método em tempo de execução.Além disso, antes da análise e após a análise, as alterações na string são anteriores e posteriores.Por que a pilha é impressa várias vezes, é porque parseStringValue O próprio método é chamado iterativamente e será impresso sempre, o que também pode ser visto nas informações da pilha (parseStringValue () 148);

O código fonte desta demonstração pode ser baixado no github, e as informações de endereço e link são mostradas na tabela abaixo:

O nome Link Observações
Página inicial do projeto https://github.com/zq2599/blog_demos A página inicial do projeto no GitHub
endereço do repositório git (https) https://github.com/zq2599/blog_demos.git O endereço do armazém do código-fonte do projeto, protocolo https
endereço do repositório git (ssh) [email protected]: zq2599 / blog_demos.git O endereço do armazém do código-fonte do projeto, protocolo ssh

Existem várias pastas neste projeto git.O código fonte deste capítulo está na pasta springcoredemo, como mostra a caixa vermelha abaixo:

Neste ponto, o combate real para modificar o código-fonte do spring-framwork está concluído.Espero que você também possa modificar e criar seus próprios locais de interesse ao aprender o spring-framwork.Espero que este artigo possa lhe fornecer algumas referências;

Publicado 376 artigos originais · elogiou 986 · 1,28 milhões de visualizações

Acho que você gosta

Origin blog.csdn.net/boling_cavalry/article/details/105384287
Recomendado
Clasificación