SpringBoot 获取扫描包路径

SpringBoot 获取扫描包路径,第1张

其中 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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9518597.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存