使用“默认”包
当一个类不包含package声明时,它被认为是在“默认包”中。通常不鼓励使用“默认包”,应该避免使用。这可能会导致使用Spring的启动应用程序的特殊问题。
会产生如下错误:
Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.
建议您遵循Java推荐的软件包命名约定,并使用反向域名(例如com.example.project)。
定位main应用类
通常建议你将main应用类放在位于其他类上面的根包(root package)中。通常使用 @EnableAutoConfiguration 注解main类,并且暗地里为某些项定义了一个基础“search package”。
使用根包允许你使用 @ComponentScan 注解而不需要定义一个 basePackage 属性。如果main类位于根包中,你也可以使
用 @SpringBootApplication 注解。
下面是一个典型的结构:
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
Application.java 文件将声明 main 方法,还有基本的 @Configuration 。
package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
Spring Boot提倡基于Java的配置。尽管你可以使用一个XML源来调用 SpringApplication.run() ,我们通常建议你使用 @Configuration 类作为主要源。一般定义 main 方法的类也是主要 @Configuration 的一个很好候选。
导入其他配置类
你不需要将所有的 @Configuration 放进一个单独的类。 @Import 注解可以用来导入其他配置类。另外,你也可以使用 @ComponentScan 注解自动收集所有的Spring组件,包括 @Configuration 类。
导入XML配置
你可以使用附加的 @ImportResource 注解加载XML配置文件。
Spring Boot自动配置(auto-configuration)尝试根据你添加的jar依赖自动配置你的Spring应用。例如,如果你的classpath下存在 HSQLDB ,并且你没有手动配置任何数据库连接beans,那么我们将自动配置一个内存型(in-memory)数据库。
你可以通过将 @EnableAutoConfiguration 或 @SpringBootApplication 注解添加到一个 @Configuration 类上来选择自动配置。
注:你只需要添加一个 @EnableAutoConfiguration 注解。我们建议你将它添加到主 @Configuration 类上。
禁用特定的自动配置
如果发现应用了你不想要的特定自动配置类,你可以@EnableAutoConfiguration 注解的排除属性来禁用它们。
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
Spring Beans和依赖注入
你可以自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖。简单起见,我们经常使用 @ComponentScan 注解搜索beans,并结合 @Autowired 构造器注入。
如果使用上面建议的结构组织代码(将应用类放到根包下),你可以添加 @ComponentScan 注解而不需要任何参数。你的所有
应用程序组件( @Component , @Service , @Repository , @Controller 等)将被自动注册为Spring Beans。
使用@SpringBootApplication注解
很多Spring Boot开发者总是使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 注解他们的main类。由于这些注解被如此频繁地一块使用(特别是你遵循以上最佳实践时),Spring Boot提供一个方便的 @SpringBootApplication 选择。
package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
@SpringBootApplication开启了spring的组件扫描和自动配置功能。实际@SpringBootApplication将三个注解合在了一起:
1. spring的@Configuration: 表明该类使用了spring基于Java的配置。
2. Spring的@componentScan:启用组件扫描,这样组件可以被扫描到
3. SpringBoot的@EnableAutoConfiguration:开启了springboot的自动配置
使用“默认”包当一个类不包含package声明时,它被认为是在“默认包”中。通常不鼓励使用“默认包”,应该避免使用。这可能会导致使用Spring的启动应用程序的特殊问题。 会产生如下错误: Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package. 建议您遵循
1.在编写第一个hello springboot项目时遇到的bug。
Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.
警告:你的应用上下文可能没有启动,因为你将注解添加到了默认的package上面了。下面的堆栈信息中也有一句话包括了这个意思。
…This can also happen if you are @ComponentScanning a springframe
exclude,排除此类的AutoConfig,即禁止
SpringBoot 自动注入数据源配置。
DataSourceAutoConfiguration.class 会自动查找 application.yml 或者 properties 文件里的 spring.datasource.* 相关属性并自动配置单数据源「注意这里提到的单数据源」。
那么问题来了,排除了自动配置,Spring还怎么识别到数据库配置呢?
答:显然接下来就需要手动配置,what?那我为什么要排除?然后手动指定数据源?
@EnableAutoConfiguration
作用:SpringBoot会自动根据你jar包的依赖来自动配置项目。
例如当你项目下面有HSQLDB的依赖时,Spring Boot会创建默认的内存数据库的数据源DataSource,如果你自己创建了DataSource,SpringBoot就不会创建默认的DataSource。
个人理解: 如果你用了Mybatis,它的配置文...
从报错信息中,我们就可以分析出错误原因是触发了数据源的自动化配置,然而当前项目其实并不需要数据源。查其根源是依赖方提供的API依赖中引用了一些多余的依赖触发了该自动化配置的加载。
为了解决上面所述的问题,我们可以用两种方法来解决:
通过外部依赖的修改来解决:通过与依赖方沟通,在对方提供的API依赖中去掉不必要的依赖
通过禁用指定的自动化配置来避免加载不必要的自动化配置,...
@SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})
DataSourceAutoConfiguration.class会自动查找application.yml或者properties文件里的spring.datasource.*相关属性并自动配置单数据源
DataSourceAutoConfiguration.class默认会帮我们自动配置单数据源,所以,如果想在项目中使用多数据源就需要排除它,手动指定多数...
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver
spring boot默认会加载
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
类,DataSourceAutoConfiguration类使用了@Configuration注解向spring注入了dataSource bean。因为工程中没有关于dataSource相关的配置信息,当spring创建dataSource b
Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package
项目启动Application没有和类处在同一个目录下,导致扫描不到类
D:\DevelopTools\java\jdk1.8.0_231\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@EnableAutoConfiguration
作用:Spring Boot会自动根据你jar包的依赖来自动配置项目。
例如当你项目下面有HSQLDB的依赖时,Spring Boot会创建默认的内存数据库的数据源DataSource,如果你自己创建了DataSource,Spring Boot就不会创建默认的DataSource。
个人理解: 如果你用了Mybatis
为什么@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
Spring Boot会自动根据jar包的依赖来自动配置项目,例如当你项目下面有HSQLDB的依赖,Spring Boot会自动创建默认的内存数据库的数据源DataSource,
但我们使用Mybatis自定义配置,想自己创建DataSource时就必须注释掉DataSourceAutoConfiguration。
使用的话 会和自定义配置的DataSource冲
首先,DataSourceAutoConfiguration.class会自动查找application.yml或者properties文件里的spring.datasource.*相关属性并配置数据源。
所以,如果想在项目中使用多数据源就需要排除它,手动指定多数据源
该注解的作用是,排除自动注入数据源的配置,所以,在SpringBoot中使用多数据源时,加上@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
同理,我们.
Java异常:Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package