
其中 AnnotationMetadata metadata 是最初的 @SpringBootApplication 标签,故 new PackageImport(metadata)getPackageName() 就可获得 @SpringBootApplication 标签所在的包路径。
总结 :SpringBoot会将 当前启动类所在包 下面的所有组件扫描到容器中。
其实特别简单,只需要在 bin 目录中的 setclasspathbat 文件前面添加:
如图
可在文本文档(txt)中新建以下内容
保存为批处理(bat)文件,即可执行可执行jar包——testjar
Context path of the application 应用的上下文路径,也可以称为项目路径,是构成url地址的一部分。
SpringBoot 200RELEASE版本以及之后
SpringBoot 200RELEASE版本以及之前
假设我的应用有个接口/api/test,我在本地的8080端口启动我的应用。访问这个接口的url为localhost:8080/api/test
加上了context-path为myapp1之后,我去访问这个接口的url就要变成localhost:8080/myapp1/api/test
springboot项目设置了context-path之后,假如设置为myapp1,那么项目启动之后,访问项目的所有请求的URI必须/myapp1开头,才能访问进项目。
我的项目设置了context-path为myapp1,然后我想搞个过滤器MyFilter来处理以"/api"开头的请求,配置filter的过滤规则的时候,我将其设置成了"/myapp1/api/",结果向应用发送localhost:8080/myapp1/api/test的时候死活也进入不到我的MyFilter过滤器中。
最后查看源码发现,如果项目设置了context-path,tomcat,spring在将请求的URI和我们设置的过滤器匹配规则进行比较的时候,用来比较的requestURI已经是去掉context-path的了,所以设置filter的匹配规则的时候不要管context-path是多少。
String path = (StringvalueOf(ThreadcurrentThread()getContextClassLoader()getResource("")))replaceAll("file:/", "")replaceAll("%20", " ")trim();
spring也是用的jdk的查找类路径方法啊
if (thisclazz != null) {
is = thisclazzgetResourceAsStream(thispath);
//调用Class类的getResourceAsStream
}
else {
is = thisclassLoadergetResourceAsStream(thispath);
//调用ClassLoader类的getResourceAsStream
}
Class类的getResourceAsStream
public InputStream getResourceAsStream(String name)查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoadergetSystemResourceAsStream(javalangString)。
在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:
如果 name 以 '/' 开始 ('\u002f'),则绝对资源名是 '/' 后面的 name 的一部分。
否则,绝对名具有以下形式:
modified_package_name/name
其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 '' ('\u002e')。
参数:
name - 所需资源的名称
返回:
一个 InputStream 对象,或者 null(如果找不到带有该名称的资源)
抛出:
NullPointerException - 如果 name 是 null
在开发Web方面的应用时, 经常需要获取服务器中当前WebRoot的物理路径。
如果是Servlet , Action , Controller, 或者Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通过ServletContextgetRealPath("/")来获取当前应用在服务器上的物理地址。
如果在类中取不到ServletContext时,有两种方式可以做到:
(1)利用Java的类加载机制:调用 XXXclassgetClassLoader()getResource(""); 方法来获取到ClassPath , 然后处理获得WebRoot目录。这种方式只能是该class在WebRoot/WEB-INF/classes下才能生效, 如果该class被打包到一个jar文件中, 则该方法失效。这时就应该用下面一种方式。
(2)spring框架的思路,在WEB-INF/webxml中,创建一个webAppRootKey的param,指定一个值(默认为webapproot)作为键值,然后通过Listener, 或者Filter,或者Servlet 执行String webAppRootKey = getServletContext()getRealPath("/"); 并将webAppRootKey对应的webapproot 分别作为Key,Value写到System Properties系统属性中。之后在程序中通过SystemgetProperty("webapproot")来获得WebRoot的物理路径。
你写个配置文件配置下这个路径,用spring注入进去,在生产环境和开发测试环境分别读取不就可以了吗,如果你嫌麻烦,那干脆在数据库中搞个表,专门存这些配置,再配合个缓存(比如redis),这样读取配置也没有什么压力,为啥一定要在程序中动态去获取呢,这样在不同环境不仅容易出问题,还不具有可控性。
对于java编程开发程序员来说,掌握新的编程技术能力能够让自己的职业发展更加顺利,下面IT培训就一起来了解一下,java程序员学习学习Spring的基础要求。
Spring官网页是这么介绍自己的——“Spring:thesourceformodernJava”,这也暗示着Spring与Java有着密切的关系,虽然Spring现在也支持其他语言,比如Groovy和Kotlin,但还是建议在学习Spring之前先储备一些基本的Java知识,如果能具备以下基础,则是更好不过了。
Spring学习路径
1SpringFramework
大家通常提到的Spring其实是指SpringFramework,它是一个开源的Java企业级应用开发框架,提供了一套完整的编程与配置模型,降低了应用的开发复杂度,让开发者能够更加专注于应用真正的业务逻辑。
2SpringBoot
随着Spring的发展,它早已从一个轻量级开发框架演变为一个“庞然大物”,从头开始搭建一个新应用的成本越来越高,充斥着大量的重复工作,有大量新的佳实践需要总结并落地。因此,SpringBoot应运而生,它能帮助开发者轻松地创建出具备生产能力的独立应用,只需很少的配置就能让大部分功能运作起来。毫不夸张地说,只要能用好SpringBoot,一定能够极大程度地提升开发效率。
3SpringCloud
在云计算日益普及的今天,微服务架构、云原生应用等概念也逐步被大家所接受,大家对大规模分布式系统早已司空见惯,这也对开发者提出了更高的要求。SpringCloud在SpringFramework与SpringBoot的基础之上,为分布式系统的开发提供了一套经过实践验证的常见模式,比如服务的发现与注册、服务的熔断与限流、服务配置、服务链路追踪等等。基于SpringCloud,开发者能够很快开发出一套分布式系统,以此满足不断变化的业务需要。
4其他Spring项目
除了上面提到的项目,Spring的大家族中还有很多成员,它们也在各自的领域中不断为提升开发者的工作效率默默努力着。
以上就是关于SpringBoot 获取扫描包路径全部的内容,包括:SpringBoot 获取扫描包路径、2019-10-10 spring boot 项目部署及指定JDK路径、Springboot中的context-path等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)