转载自 https://blog.csdn.net/zzzgd_666/article/details/80310840
首先,我们来看看@SpringBootApplication注解代码,如下代码,它分别继承了3个注解
1、@EnableAutoConfiguration
2、@ComponentScan
3、@SpringBootConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
//.....
}
所以它同时具备了@ComponentScan、@EnableAutoConfiguration的功能。
很多Spring Boot开发者总是使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 注解他们的main类。 由于这些注解被如此频繁地一块使用(特别是你遵循以上最佳实践时) , Spring Boot提供一个方便的 @SpringBootApplication 选择。该 @SpringBootApplication 注解等价于以默认属性使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 。
一般来说, main应用类应该放在其他类上面的根包(root package) 中,此时@ComonentScan注解不需要配置basePackage
属性,这个包下的所有子包和子类都会被扫描。
下面是一个典型的结构:
cn
+- zgd
+- project
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
这个注解是Spring应用程序上下文的自动配置,尝试猜测和配置您可能需要的bean。自动配置类通常基于类路径和定义的bean应用。例如,如果你有 tomcat-embedded.jar在您的类路径中,你可能会想要一个TomcatEmbeddedServletContainerFactory(除非你定义自己的EmbeddedServletContainerFactory bean)。
当然我们也可能不需要他自动配置,这时候需要用排除的方式:
@Configuration
//exclude= {DataSourceAutoConfiguration.class} 通过排除属性来禁止DataSourceAutoConfiguration的配置
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
@ComponentScan
public class Application {
.....
你可以自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖。 这里经常使用 @ComponentScan 注解搜索beans, 并结合 @Autowired 构造器注入。 如果使用上面建议的结构组织代码(将应用类放到根包下) , 你可以添加 @ComponentScan 注解而不需要任何参数。 你的所有应用程序组件(@Component , @Service , @Repository , @Controller 等) 将被自动注册为Spring Beans。