在Spring Boot中,“开箱即用”和“自动装配”是两个重要的特性,它们大大简化了应用程序的开发和维护。通过这些特性,开发者可以专注于业务逻辑,而不必陷入繁琐的配置中。
“开箱即用”意味着开发者可以通过最少的配置,快速启动和运行一个Spring应用程序。Spring Boot通过提供一系列的“Starter”依赖和自动配置功能,能够快速构建应用,而无需手动配置大量的XML或Java配置类。
org.springframework.boot
spring-boot-starter-web
Spring Boot的自动配置功能通过@EnableAutoConfiguration
注解实现。它根据类路径中的依赖,自动配置Spring应用程序所需的Bean,极大地减少了手动配置的工作量。
@SpringBootApplication
注解,该注解实际上是组合注解,包含了@EnableAutoConfiguration
和@ComponentScan
。@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
spring.factories
文件,该文件位于spring-boot-autoconfigure
模块中。该文件列出了所有的自动配置类。org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
@SpringBootApplication
注解中,@ComponentScan
会自动扫描主应用类所在包及其子包中的所有组件(如@Component
、@Service
、@Repository
、@Controller
等),确保这些组件能够被自动装配。@Conditional
注解来定义条件。以下是两个常见的自动配置类示例:DataSourceAutoConfiguration
@Configuration // 标记为配置类
@ConditionalOnClass(DataSource.class) // 检查DataSource类是否在类路径中
public class DataSourceAutoConfiguration {
@Bean // 定义一个Bean
@ConditionalOnMissingBean // 如果没有自定义的DataSource Bean,则创建一个
public DataSource dataSource() {
return new HikariDataSource(); // 返回HikariCP数据源
}
}
@ConditionalOnClass(DataSource.class)
:检查DataSource
类是否存在于类路径中,如果存在,则加载该配置。@ConditionalOnMissingBean
:如果没有其他DataSource
类型的Bean,则创建一个新的HikariDataSource
。WebMvcAutoConfiguration
@Configuration // 标记为配置类
@EnableWebMvc // 启用Spring MVC
public class WebMvcAutoConfiguration implements WebMvcConfigurer {
@Bean // 定义视图解析器Bean
@ConditionalOnMissingBean // 如果没有自定义的视图解析器,则创建一个
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // 设置视图前缀
resolver.setSuffix(".jsp"); // 设置视图后缀
return resolver; // 返回视图解析器
}
}
@EnableWebMvc
:启用Spring MVC的配置。@ConditionalOnMissingBean
:如果没有其他视图解析器Bean,则创建一个新的InternalResourceViewResolver
。@Bean
注解定义的方法创建相应的Bean。Spring容器会自动管理这些Bean的生命周期。ApplicationContext
实例(通常是AnnotationConfigApplicationContext
)。@Configuration
类,查找标记为@Bean
的方法。import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service // 标记为服务类
public class UserService {
@Autowired // 自动注入数据源
private DataSource dataSource;
public void printDataSourceInfo() {
System.out.println("Database URL: " + dataSource.getConnection().getMetaData().getURL());
}
}
2.7.1 ImportSelector与SpringFactoriesLoader
在自动配置中,
ImportSelector
接口用于选择需要导入的配置类。Spring Boot的自动配置类通过@EnableAutoConfiguration
注解和spring.factories
文件实现自动装配。具体来说,@EnableAutoConfiguration
会调用AutoConfigurationImportSelector
,该类使用spring.factories
文件中的配置来加载相关的自动配置类。
SpringFactoriesLoader
是用于加载spring.factories
文件的工具类。它会根据spring.factories
文件中的配置,加载所有的自动配置类。这样,Spring Boot能够根据类路径中的不同依赖,自动选择合适的配置类进行装配。2.7.2 @Configuration与@Conditional
标记为
@Configuration
的类表示这是一个Spring配置类,里面可以定义Bean。Spring Boot的自动配置类通常都是通过这个注解来标识的。
@Conditional
用于指示Bean的创建条件。自动配置类中常用的条件注解有:
@ConditionalOnClass
:当某个类在类路径中存在时才创建Bean。@ConditionalOnMissingBean
:当容器中不存在某个Bean时才创建。
Spring Boot的自动配置机制能够根据类路径中的依赖,自动创建和配置所需的Bean,极大地简化了配置过程。在此过程中,@ComponentScan
注解的作用是确保Spring能够扫描到项目中的所有组件(如服务、控制器等),从而使得自动装配顺利进行。开发者可以在业务逻辑中直接使用这些自动配置的Bean,而无需关心它们的创建和管理。
Spring Boot支持将应用程序的配置外部化,开发者可以通过application.properties
或application.yml
文件进行配置,支持不同环境的配置管理。
src/main/resources
目录下创建application.properties
或application.yml
文件。# application.properties
server.port=8080
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
application.properties
或application.yml
文件中的配置。在应用启动时,Spring会将这些配置加载到环境中。@ConfigurationProperties
注解@ConfigurationProperties
注解将配置文件中的属性映射到该类中。import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component // 将该类标记为Spring组件
@ConfigurationProperties(prefix = "spring.datasource") // 指定前缀
public class DataSourceProperties {
private String url; // 数据源URL
private String username; // 数据库用户名
private String password; // 数据库密码
// Getters and Setters
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@ConfigurationProperties(prefix = "spring.datasource")
:指示Spring Boot将以spring.datasource
开头的配置加载到DataSourceProperties
类中。DataSourceProperties
对象。import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service // 标记为服务类
public class UserService {
@Autowired // 自动注入数据源属性
private DataSourceProperties dataSourceProperties;
public void printDataSourceInfo() {
System.out.println("Database URL: " + dataSourceProperties.getUrl());
}
}
application-dev.properties
、application-prod.properties
。java -jar myapp.jar --spring.profiles.active=dev
通过外部化配置,Spring Boot允许开发者根据不同的部署环境使用不同的配置,改善了应用的灵活性和可维护性。使用@ConfigurationProperties
注解可以将配置集中管理,使得应用的配置更加清晰。