Spring Boot笔记 #03# Developing with Spring Boot
译自:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using
4. Auto-configuration
Spring Boot auto-configuration尝试根据添加的jar依赖项自动配置Spring应用程序。例如,如果HSQLDB在类路径上,并且您没有手动配置任何数据库连接bean,那么Spring Boot将自动配置内存中的数据库。
您需要通过在@Configuration类中添加@EnableAutoConfiguration或@SpringBootApplication注解来启用自动配置。
您应该只添加一个@SpringBootApplication或@EnableAutoConfiguration注解。我们通常建议您只将其中一个添加到主@Configuration类中。
4.1. Gradually Replacing Auto-configuration
auto-configuration是非侵入性的(non-invasive)。在任何时候,您都可以开始定义自己的配置来替换auto-configuration的特定部分。例如,如果您添加自己的DataSource bean,默认的嵌入式数据库支持就会后退(backs away)。
如果您需要了解当前应用的auto-configuration以及原因,请使用--debug模式(the --debug
switch)启动应用程序。这样做可以为选定的核心记录器启用调试日志,并将条件报告记录到控制台。这样做可以为选定的核心记录器启用调试日志,并将条件报告记录到控制台。
4.2. Disabling Specific Auto-configuration Classes
如果你发现某个你不想要的自动配置类正在被应用,你可以使用@SpringBootApplication的exclude属性来禁用它们,如下所示:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class MyApplication { }
5. Spring Beans and Dependency Injection
您可以自由地使用任何标准Spring Framework技术来定义bean及其注入的依赖项。我们通常建议使用构造函数注入来连接依赖和@ComponentScan来查找bean。
如果您按照上面建议的方式构造代码(将应用程序类定位在顶级包中),您可以不带任何参数添加@ComponentScan或使用隐式包含它的@SpringBootApplication注释。您的所有应用程序组件(@Component、@Service、@Repository、@Controller,以及其他)都自动注册为Spring bean。
下面的例子展示了一个@Service Bean,它使用构造函数注入来获得一个所需的RiskAssessor Bean:
import org.springframework.stereotype.Service; @Service public class MyAccountService implements AccountService { private final RiskAssessor riskAssessor; public MyAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; } // ... }
如果一个bean有多个构造函数,你需要用@Autowired标记你想让Spring使用的构造函数:
import java.io.PrintStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyAccountService implements AccountService { private final RiskAssessor riskAssessor; private final PrintStream out; @Autowired public MyAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; this.out = System.out; } public MyAccountService(RiskAssessor riskAssessor, PrintStream out) { this.riskAssessor = riskAssessor; this.out = out; } // ... }
6. Using the @SpringBootApplication Annotation
许多Spring Boot开发者喜欢他们的应用使用自动配置(auto-configuration)、组件扫描(component scan),并且能够在他们的“应用类(application class)”上定义额外的配置(configuration)。一个@SpringBootApplication注释可以用来启用这三个特性,即:
- @EnableAutoConfiguration:启用Spring Boot的自动配置机制(Spring Boot’s auto-configuration mechanism)
- @ComponentScan:在应用程序所在的包上启用@Component scan(参见the best practices)
- @SpringBootConfiguration:允许在上下文中注册额外的bean,或者导入额外的配置类。Spring标准@Configuration的替代方案,它可以帮助集成测试中的配置检测(configuration detection)。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // Same as @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
这些特性都不是强制性的,您可以选择用它启用的任何特性来替换这个单一的注释。例如,你可能不想在你的应用程序中使用组件扫描(component scan)或配置属性扫描(configuration properties scan):
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Import; @SpringBootConfiguration(proxyBeanMethods = false) @EnableAutoConfiguration @Import({ SomeConfiguration.class, AnotherConfiguration.class }) public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
在这个例子中,MyApplication和其他任何Spring Boot应用程序一样,除了带@Component注释的类和带@ConfigurationProperties注释的类不会自动检测到,用户定义的bean会显式导入(参见@Import)。
10. What to Read Next
现在,您应该了解如何使用Spring Boot以及应该遵循的一些最佳实践。现在,您可以继续深入了解Spring Boot的特定特性(specific Spring Boot features ),或者跳过它,阅读Spring Boot的“生产准备(production ready)”方面的内容。