springboot不能找到本地可用数据源

springboot不能找到本地可用数据源,第1张

spring boot默认加载文件的路径是

/META-INF/resources/

/resources/

/static/

/public/

这些目录下面, 当然我们也可以从spring boot源码也可以看到

简单demo

使用 maven 构建项目,官方现在稳定版本是154,第一个入门demo不是web项目,pom依赖如下:

实体 User 类:

配置类:

入口类 Application :

项目结构目录

启动程序,以 main 方法启动:

打印出正确的结果。

来分析一下流程,为何 Runnable 类, User , Map 会纳入spring容器

首先我们分析的就是入口类 Application 的启动注解 @SpringBootApplication ,进入源码:

发现 @SpringBootApplication 是一个复合注解,包括 @ComponentScan ,和 @SpringBootConfiguration , @EnableAutoConfiguration 。

根据上面的理解,上面的入口类 Application ,我们可以使用:

使用 @ComponentScan 注解代替 @SpringBootApplication 注解,也可以正常运行程序。原因是 @SpringBootApplication 中包含 @ComponentScan ,并且 springboot 会将入口类看作是一个 @SpringBootConfiguration 标记的配置类,所以定义在入口类 Application 中的 Runnable 也可以纳入到容器管理。

看一个demo学会使用这些参数配置

在包下comzhihaomiaospringboot定义一个启动应用类(加上@SpringBootApplication注解)

在comzhihaomiaobeans包下定义一个实体类,并且想将其纳入到spring容器中,

启动启动类,打印结果如下:

说明Cat类并没有纳入到spring容器中,这个结果也如我们所想,因为@SpringBootApplication只会扫描@SpringBootApplication注解标记类包下及其子包的类(特定注解标记,比如说@Controller,@Service,@Component,@Configuration和@Bean注解等等)纳入到spring容器,很显然MyConfig不在@SpringBootApplication注解标记类相同包下及其子包的类,所以需要我们去配置一下扫包路径。

修改启动类,@SpringBootApplication(scanBasePackages = "comzhihaomiao"),指定扫描路径:

启动并打印:

当然使用@SpringBootApplication(scanBasePackageClasses = MyConfigclass),指定scanBasePackageClasses参数的value值是你需要扫描的类也可以,结果一样,不过如果多个配置类不在当前包及其子包下,则需要指定多个。

再看一个列子,

在上面的列子的相同包下(comzhihaomiaospringboot)配置了People,并将其纳入到spring容器中(@Component),我们知道@SpringBootApplication注解会扫描当前包及其子包,所以People类会纳入到spring容器中去,我们需要将其排除在spring容器中,如何 *** 作?

可以使用@SpringBootApplication的另外二个参数(exclude或excludeName)

启动类,

启动并打印结果:

然后修改@SpringBootApplication配置,

很明显启动报错。使用@excludeName注解也可以。如下,

@SpringBootApplication(excludeName = {"comzhihaomiaospringbootPeople"})

参考文档:

Springboot154官方文档

通过查看SpringBootApplication的源码,会发现这是一个组合注解,其中最重要的注解是@EnableAutoConfiguration

先看@AutoConfigurationPackage这个注解

里面导入了一个Registrar类,这个类实现了bean的扫描与注册,那它扫描的是哪个包呢?

只要看PackageImports这个类,会发现如果没有用@ComponentScan指定包名,他默认扫描的是启动类的包名,比如你的启动类是cnhollycloudApp,它扫描的就是cnhollycloud

再来看AutoConfigurationImportSelector这个类,这个类用来加载所有的自动配置项

通过上面的源码我们知道spring把所有配置项都导进来了,但我们并不需要所有的功能。比如说我开发的时候并不需要mongodb相关功能,但spring也会把相关配置项加载进来,怎么关闭该功能呢?看下mongodb的自动配置源码

重点是@ConditionalOnClass(MongoClientclass),这个的意思是只有类路径中存在MongoClientclass,也就是我们导入mongo相关依赖,这个配置项才会开启,否则不会注册这个bean。

同时我们看下面有个MongoClient的bean,spring很贴心地为我们初始化好了mongo的客户端,我们直接使用就行了,如果想自定义客户端怎么办呢?也很简单,直接自己初始化一个mongo客户端放入spring容器就行了,@ConditionalOnMissingBean的意思是如果你没有自定义客户端它才会自己生成一个,是不是很方便,这个叫条件化注解

现在我们来实现一个简单的自动配置类来巩固下。

可以想象一下我们是一家机器人公司,专门制造高端机器人,很受客户欢迎,但是配置机器人过于复杂,这点老是被客户诟病,你的领导想让你提供给客户开机即用的产品,该如何实现呢?

首先我们创建一个机器人控制终端,这是控制终端可以 *** 控机器人说话

接下来是自动配置项,可以自动注册配置终端

我们想要给客户一点自由,可以让客户自由配置机器人的名字和颜色,而不用管机器内部复杂的 *** 作

接下来最重要的一步是把自动配置项放到类路径的/META-INF/springfactories里面

然后客户直接引用你提供的依赖就能直接控制机器人了,而不用管复杂的初始化 *** 作

来控制机器人说话吧,直接注入robot就能使用了,不需要客户关心复杂的初始化 *** 作了

如果客户想为机器人改个名字也很简单,直接在applicationyml配置下就行了

这个例子虽然很简单,但是说明了自动配置的工作原理,spring内置的自动配置虽然复杂,但原理都一样的。

参考代码: >

以上就是关于springboot不能找到本地可用数据源全部的内容,包括:springboot不能找到本地可用数据源、springboot快速入门及@SpringBootApplication注解分析、SpringBoot入门-自动配置详解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9774076.html

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

发表评论

登录后才能评论

评论列表(0条)

保存