对PropertyPlaceholderHelper.java的具体修改如下所示:
- 新增一个private方法,用于打印当前堆栈位置:
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());
}
- 找到方法parseStringValue,注意是protected类型的那个,在该方法的起始位置添加如下两行代码:
protected String parseStringValue(
String strVal, PlaceholderResolver placeholderResolver, Set visitedPlaceholders) {
printTrack(“start parseStringValue”);
logger.info(“before parse : [” + strVal + “]”);
上述代码先是将parseStringValue被调用的堆栈打印出来,接着将入参strVal打印出来;3. 在上一步中的parseStringValue方法的结束位置,在return之前增加一行代码,将处理后的字符串打印出来,如下:
logger.info(“after parse : [” + result + “]”);
return result.toString();
}
- 为了避免当前电脑的其他项目用到我们构建的spring版本,我们把版本号改掉,打开gradle.properties文件,修改版本号为"4.1.88.RELEASE",如下:
version=4.1.88.RELEASE
编译构建spring-framework
-
用命令build -x test编译和构建工程,操作如下图所示:
-
等待构建完成之后,用命令install将构建的jar部署到本地maven仓库中,如下图:
-
去本地maven仓库看看,果然已经有文件了,如下图:
创建demo,使用本地仓库的spring-framework
基于maven创建一个java应用,以下是步骤:
- pom.xml内容如下:
<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”>
4.0.0
com.bolingcavalry
springcoredemo
1.0-SNAPSHOT
org.springframework
spring-core
4.1.88.RELEASE
org.springframework
spring-context
4.1.88.RELEASE
- 新增文件:src/main/resources/applicationContext.xml,用于配置bean,内容如下:
<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">
- 创建一个类:com.bolingcavalry.bean.Simple.java:
public class Simple {
public void execute() {
System.out.println(“Simple execute method”);
}
}
- 创建启动类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();
}
}
注意以上代码中有个变量${CONFIG_PATH},这个变量的值不在代码和配置文件中,留待运行的时候再设置;5. 运行DemoApplication.java的时候,注意传入环境变量CONFIG_PATH的值,在IDEAL上的做法如下,点击红框中的"Edit Configurations…":
-
如下图,点击红框中的按钮:
-
如下图,点击红框中的加号,然后添加一个键值对,Name是"CONFIG_PATH",Value是"classpath:applicationContext.xml"
-
配置完毕后,点击下图红框中的绿色三角形按钮,即可运行DemoApplication的main方法,并且刚刚设置的环境变量也生效了:
-
运行结果如下:
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\c
ldrdata.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.() 137 <-
org.springframework.context.support.ClassPathXmlApplicationContext.() 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.() 137 <-
org.springframework.context.support.ClassPathXmlApplicationContext.() 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.() 137 <-
org.springframework.context.support.ClassPathXmlApplicationContext.() 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
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
如果你需要这些资料, ⬅ 专栏获取
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-pM2oKtmd-1719338709743)]
[外链图片转存中…(img-LHN5XR9A-1719338709744)]
[外链图片转存中…(img-ZrNgAkzL-1719338709744)]
[外链图片转存中…(img-KAyE9jKS-1719338709745)]
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
如果你需要这些资料, ⬅ 专栏获取