SpringBoot AutoConfigure学习总结

本文主要探讨了SpringBoot自动配置的原理,包括自动配置类的激活条件、如何加载配置以及各种条件注解的使用,例如@ConditionalOnClass、@ConditionalOnBean等。SpringBoot通过在spring.factories文件中定义@EnableAutoConfiguration入口,结合各组件的自动配置类,实现了一键启动即可拥有完整功能的便捷性。
  1. SpringBoot 优点

自动配置是Spring Boot的最大亮点,完美的展示了CoC约定由于配置。Spring Boot能自动配置Spring各种子项目(Spring MVC, Spring Security, Spring Data, Spring Cloud, Spring Integration, Spring Batch等)以及第三方开源框架所需要定义的各种Bean。

Spring Boot内部定义了各种各样的XxxxAutoConfiguration配置类,预先定义好了各种所需的Bean。只有在特定的情况下这些配置类才会被起。
2. 自动配置类清单
spring-boot-autoconfigure-1.5.1.RELEASE.jar/META-INF/spring.factories

Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
……
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

  1. 自动配置类定义

以org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 为例子:

  1. @Configuration
  2. @ConditionalOnWebApplication(type = Type.SERVLET)
  3. @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class })
  4. @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
  5. @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
  6. @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class })
  7. public class WebMvcAutoConfiguration {

    1. @Bean
  8. @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
  9. public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
  10. return new OrderedHiddenHttpMethodFilter();
  11. }

    1. // …

    1. }

  1. 如何加载这些自动配置的类

通过执行SpringApplication.run()方法,会把当前的SpringBootDemoApplication作为source传入,而在SpringApplication类中还会读取spring.factories中的设置一并构建应用的Context

  1. 自动配置类加载的条件

条件配置 基于Spring的@Conditional,SpringBoot提供了丰富的条件配置:
引用
@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效

参考:
http://rensanning.iteye.com/blog/2363467

### 实验过程总结 #### 构建Maven项目 借助IDEA创建Maven项目,通过选择`File` -> `New` -> `Project`,在左侧选择`Maven`,按照向导完成项目创建。此步骤为后续Spring Boot项目搭建提供基础框架。 #### 添加项目依赖 在`pom.xml`文件中添加Spring Boot相关依赖。`spring-boot-starter-parent`作为父项目,统一管理Spring Boot依赖版本;`spring-boot-starter-web`用于构建Web应用,包含RESTful应用所需组件;`spring-boot-maven-plugin`插件用于打包和运行Spring Boot应用程序。示例`pom.xml`如下: ```xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>spring-boot-maven-demo</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.4</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` #### 编写程序启动类 在`src/main/java`目录下创建启动类,使用`@SpringBootApplication`注解开启Spring Boot的自动配置和组件扫描功能。示例代码如下: ```java 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); } } ``` #### 编写Spring MVC控制器 在`src/main/java`目录下创建Spring MVC控制器,使用`@RestController`注解表明这是一个RESTful风格的控制器,`@RequestMapping`注解映射请求路径,`@GetMapping`注解处理HTTP GET请求。示例代码如下: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("index") public class IndexController { @GetMapping("/hello") public String sayHello(){ return "hello, spring boot!"; } } ``` #### 运行项目 可通过两种方式运行项目:在IDEA中,在`Application`类的`main`方法处点击运行按钮启动项目;在项目根目录下的命令行窗口,执行`mvn spring-boot:run`命令启动项目。 ### 实验结论 通过上述步骤,成功使用Maven方式构建了一个Spring Boot项目。该项目具备基本的Web应用功能,能够处理HTTP请求并返回响应。Maven在项目构建过程中起到了依赖管理和项目打包的重要作用,Spring Boot的自动配置功能极大地简化了项目的开发和配置过程。 ### 实验问题与解决 在实验过程中,可能会遇到依赖冲突、端口被占用等问题。对于依赖冲突,可通过`mvn dependency:tree`命令查看依赖树,排除冲突的依赖;对于端口被占用问题,可修改`application.properties`文件中的`server.port`属性来更换端口。 ### 实验拓展 可进一步学习Spring Boot的其他功能,如数据库访问、安全认证、缓存等,还可将项目部署到云服务器上,实现线上访问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值