Springboot基础知识
一、启动
引入依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
主程序:
/** * 主程序类 *
@SpringBootApplication:
这是一个SpringBoot应用 */
@SpringBootApplication
Public class MainApplication{
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
业务逻辑:Controller
@RestController
Public class HelloController{
@RequestMapping("/hello")
public String handle01(){
return"Hello, Spring Boot 2!";
}
}
可以用RestController代替标签
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
@RequestMapping
在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
配置:
可以在resources里单独写一个配置,集中对项目进行配置处理。
部署:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
可以通过把项目打成jar包的方式部署。通过maven工具
二、依赖管理:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
</parent>
如果要寻找,它还有父管理:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.3</version>
</parent>
在这里通过标签<properties>对开发常用依赖的版本号进行了规定
如果我们不满意自动依赖的版本,可以自己生命<properties>对版本进行规定
Spring-boot-starter-*:
Spring-boot的版本启动,用来加载某一情景下的的环境依赖
在官方文档中可见不同的starter:
也可以自己创建属于自己的starter,命名格式 *-spring-boot-starter
引入依赖管理,自动版本仲裁,不需要写版本号。但是引入非版本仲裁的jar,要写版本号。
在spring-boot-starter-web中,配置了Springmvc的常用组件,等所有常用场景的组件。
spring也对包自动扫描进行了默认:
主程序结构下的所有包都会被扫描。如果扫描的包结构在主程序之上,可以通过@SpringBootApplication(scanBasePackages="路径"); 进行自定义扫描路径
或者使用@ComponentScan() 注意SpringBootApplication包含了CoponentScan,到主程序包下进行扫描。
默认配置:
默认配置最终都是映射到某个类上,可以通过写properties文件进行修改默认值。
三、注解:
1.用java方式写容器的注入配置。
@Configuration:
表示这是一个配置类。
@Bean
Public User user01(){
Return new User("zhangsan",18);
}
通过bean标签给容器添加组件,返回类是组件类型,类名是组件id,返回值是组件注入的值。
默认是单实例。
@Configuration(proxyBeanMethods=true默认)
proxyBeanMethods,代理bean方法
FULL模式:参数为true,外部无论调用组件注册方法多少次,得到的都是注册到容器中的单实例组件。
LITE模式:参数为false,外部调用,返回的bean是新创建的。
如果有组件依赖,用全模式。加载会检查是否存在。直接用代理。
如果没有组件依赖,用轻量级模式,加载跳过检查。
2.Spring中常用的注解仍可以使用:
@Bean、@Component、@Controller、@Service、@Repository
@ComponentScan(指定扫描包)
@Import({*.class})给容器自动创建两个类型的组件,默认组件名为全类名
@Conditional
满足Conditional指定的条件,则进行组件注入。
@ImportResource(classpath:beans.xml)
进行xml配置的迁移。
@ConfigurationProperties配置绑定
配置ConfigurationProoerties(Prefix=“xxx”)前缀
只有在容器中的组件才能拥有Springboot的强大功能,所以需要标识为@Component
也可以(java方式进行注解的配置类中@EnableConfigurationProperties(xxx.class))+@ConfigurationProperties
在java配置类中开启具体类的属性配置功能,然后再具体类中进行属性配置的设置@ConfigurationProperties(prefix="xxx")
这时,会把指定的class作为组件自动导入容器中,不用手写@Component
四、自动配置原理
@SpringbootConfiguration
代表当前是个配置类,底层用了@Configuration
@ComponentScan
指定扫描包
@EnableAutoConfiguration
底层:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public@interfaceEnableAutoConfiguration{}
@AutoConfigurationPackage:
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件public@interfaceAutoConfigurationPackage{}
//利用Registrar给容器中导入一系列组件
//将指定(注解所在位置的)的一个包下的所有组件导入进来?MainApplication 所在包下。
@Import(AutoConfigurationImportSelector.class):
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactorie s(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
默认加载所有组件,最终因为@Conditional按需装配
@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件,用户的命名没有规范
public MultipartResolver multipartResolver(MultipartResolver resolver) {
//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
//SpringMVC multipartResolver。防止用户的命名规范不标准找不到
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
}
• SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
• 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值,因为为了一些值不写死,方便进行修改操作。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
• 生效的配置类就会给容器中装配很多组件
• 只要容器中有这些组件,相当于这些功能就有了
• 定制化配置
• 用户直接自己@Bean替换底层的组件
• 找到组件获取的配置文件值,自己再配置文件修改。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!