Java - SpringBoot(基础)

ops/2024/10/19 13:33:29/

SpringBoot基础

概述

SpringBoot是Spring提供的一个子项目,用于快速构建Spring应用程序。
SpringBoot特性
1.起步依赖
本质上就是一个Maven坐标,整合了完成一个功能需要的所有坐标。就是通过一个依赖,可以代替所有所需的依赖。
2.自动配置
遵循约定大于配置的原则,在boot程序启动后,一些bean对象会自动注入到ioc容器,不需要手动声明,简化开发。
3.其他特性
内嵌Tomcat、Jetty
外部化配置
不需要XML配置(properties/yml)

SpringBoot入门

案例需求:
使用SpringBoot开发一个web应用,浏览器发起请求/hello后,给浏览器返回字符串"hello world ~"

过程

  1. 创建Maven工程

  2. 导入spring-boot-stater-web起步依赖

  3. 编写Controller

@RestController
public class HelloController {@RequestMapping("/hello")public String hello() {System.out.println("Hello World ~");return "Hello World ~";}
}
  1. 提供启动类

手动创建SpringBoot工程

  1. 创建Maven工程

  2. 引入依赖

  3. 提供启动类

配置文件

properties配置文件 (application.properties)

springboot的所有配置文件的位置:
https://docs.spring.io/spring-boot/appendix/application-properties/index.html

properties配置文件中内容的格式
spring.application.name=demo1
server.port=9090
server.servlet.context-path=/start1

yml配置文件(application.yml)

yml使用方式:

书写三方技术配置信息,书写自定义配置信息

yml的配置信息书写:

值前面必须有空格,作为分隔符
使用空格作为缩进表示层级关系,相同的层级左侧对齐

#发件人的相关信息
email:user: "231@qq.com"code: "afdas"host:  faff.comauth: true
yml的配置信息获取:

使用@Value("${键名}")

public class EmailPerperties{@Value("${email.user}")public String user;
}

使用@ConfigrationPropperties(prefix="前缀"),但要保证实体类的成员变量名与配置文件中的键名保持一致。

整合MyBatis

导入MyBatis的起步依赖和mysql的依赖

<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency>

编写application.yml配置信息

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTCusername: rootpassword: 123456

业务代码的实现

Bean对象管理

1.Bean扫描

SpringBoot默认扫描启动类所在的包及其子包;
其他的Bean,可以用@ComponentScan(basePackages="org.example")即可将该包下及其子包所需的Bean注册到ioc容器中

2.Bean注册

相关注解

@Component 声明bean的基础注解
@Controller @Component的衍生注解,标注在控制器类上
@Serivce @Component的衍生注解,标注在业务类上
@Repository @Component的衍生注解,标注在数据访问类上 (由于与mybatis整合,用的少)

关于三方jar包中的类对应的Bean,使用@Bean和Import
@Bean

在启动类或者配置类(@Configuration)中创建一个方法,在该方法里创建一个对象。在该方法上注解一个@Bean就可以了。
如果方法内部需要使用到ioc容器中已经存在的bean对象,那么只需要在方法上声明即可,spring会自动的注入。

@Import

一般导入配置类或导入ImportSelector接口实现类
可以通过一个配置类,在配置类中创建方法,在方法内部创建多个类的多个Bean。之后在启动类上加一个@Import(配置类的class)

@Import(CommonConfig.class)

可以通过ImportSelector接口实现类,在重写的方法中加入多个配置类的全限定名,之后在启动类上加一个@Import(该类的class),之后就能导入配置类,导入配置类中的多个Bean。

@Import(CommonImportSelector.class)public class CommonImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {List<String> imports = new ArrayList<>();InputStream res = CommonImportSelector.class.getClassLoader().getResourceAsStream("common.imports");/*````````*/BufferedReader br = new BufferedReader(new InputStreamReader(res));String line=null;try {while((line=br.readLine())!=null){imports.add(line);}} catch (IOException e) {throw new RuntimeException(e);} finally {if (br != null) {try {br.close();} catch (IOException e) {throw new RuntimeException(e);}}}/*````````*/return imports.toArray(new String[0]);}
}
可以自定义注解,封装@Import注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import(CommonImportSelector.class)
public @interface EnableCommonConfig {
}

3.注册条件

关于Bean注册后所有属性字段为null问题,不能写死的话,可以通过配置信息获取,在application.yml中配置。

@Configuration
public class CommonConfig {@Beanpublic Country country(@Value("${country.name}") String name, @Value("${country.system}") String system){Country country = new Country();country.setName(name);country.setSystem(system);return country;}
}
问题:

如果application.yml中配置所需信息就注入,没有就不注入,但是不能报错。
SpringBoot提供了设置注册生效条件的注解@Conditional,但是使用起来复杂,所以使用它的衍生注解

@ConditionalOnProperty

配置文件中存在对应的属性,才注入该bean;不存在就不注入

@Configuration
public class CommonConfig {@ConditionalOnProperty(prefix = "country",name = {"name","system"})@Beanpublic Country country(@Value("${country.name}") String name, @Value("${country.system}") String system){Country country = new Country();country.setName(name);country.setSystem(system);return country;}@Beanpublic Province province(){return new Province();}
}
@ConditionalOnMissingGBean

当不存在当前类型的bean时,才注入该bean;如果不存在Country,就注入Province。

@ConditionalOnMissingBean(Country.class)@Beanpublic Province province(){return new Province();}
@ConditionalOnClass

当前环境存在指定的这个类时,才注入该bean

@ConditionalOnClass(name="org.springframework.web.servlet.DispatcherServlet")@Beanpublic Province province(){return new Province();}

自动配置

自动配置:

遵循约定大于配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器。
SpringBoot自动配置,提供一个自动配置类,把该类类名写到指定的配置文件中。

第三方jar包中的Bean自动配置

当Spring Boot应用程序启动时,Spring Boot会扫描并加载所有在.import文件中配置的自动配置类,而配置类被自动配置类用@Import导入,这样该配置类中的所有Bean对象根据条件都会被注入ioc容器中。

通过这种方式,Spring Boot在启动时会自动配置自动配置类,并通过@Import注解被动地导入配置类,从而将配置类中的Bean对象注入到Spring容器中。这种机制使得配置更加模块化和灵活,便于管理和复用。

  1. 有配置类CommonConfig,用来配置Bean对象

public class CommonConfig {public CommonConfig() {}@ConditionalOnProperty(prefix = "country",name = {"name", "system"})@Beanpublic Country country(@Value("${country.name}") String name, @Value("${country.system}") String system) {return new Country(name, system);}@Beanpublic Province province() {return new Province();}
}
  1. 有自动配置类,带2个注解@AutoConguration用来标识该类是自动配置的,

@Import(CommonConfig.class)导入配置类
@AutoConfiguration
@Import({CommonConfig.class})
public class CommonAutoConfig {public CommonAutoConfig() {}
}
  1. 有.import配置文件,在该文件中写入自动配置类的全限定名。

cn.itcast.config.CommonAutoConfig

SpringBoot自动配置原理

  • 在主启动类上添加了SpringBootApplication注解,这个注解组合了EableAutoConfiguration注解。

  • EnableAutoConfiguration注解又组合了AutoConfigurationImportSelector类

  • 实现selectImports方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为.import文件(boot2.7以前版本读取的是spring.factories文件)

  • 读取到全类名了之后,就会解析注册条件,也就是@Conditional及其衍生注解把满足注册条件的Bean对象自动注册到ioc容器中。

自定义stater

在实际开发中,经常会定义一些组件,提供给各个项目团队使用。而在Spring Boot的项目中,一般会将这些公共组件封装为SpringBoot的starter。

起步依赖会由两个工程组成

xxx-autoconfigure:提供自动配置功能
xxx-starter:提供依赖管理功能

需求:自定义mybatis的starter

步骤:
1.创建 dmybatis-spring-boot-autoconfigure模块,提供自动配置功能,并自定义配置文件 META-INF/spring/xxx.imports
引入相关依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.3.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId><version>3.3.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.14</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies>
自动配置类Configure
@AutoConfiguration  //表示当前类是一个自动配置类
public class MyBatisAutoConfig {//SqlSessionFactoryBean@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}//MapperScannerConfigurer@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory) {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();//扫描的包:启动类所在的包及其子包List<String> packages = AutoConfigurationPackages.get(beanFactory);String p = packages.get(0);mapperScannerConfigurer.setBasePackage(p);//扫描的注解:mapperScannerConfigurer.setAnnotationClass(Mapper.class);return mapperScannerConfigurer;}
}
创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件

创建.imports文件导入自动配置类的全类名,文件所在位置META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,不能变!!!

2.从创建dmybatis-spring-boot-starter 模块,在starter中引入自动配置模块

引入我们创建的autoconfigure
最好在引入dmybatis-spring-boot-autoconfigure所需的依赖

<dependencies><dependency><groupId>org.example</groupId><artifactId>dmybatis-spring-boot-autoconfigure</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.3.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId><version>3.3.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.14</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies>
取代mybatis-spring-boot-starter成功!!!
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>3.0.3</version>-->
<!--        </dependency>--><!--   自定义的mybatis起步依赖     --><dependency><groupId>org.example</groupId><artifactId>dmybatis-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency>
注:

如果编译不成功,你的Maven工程可能默认是JDK5,太低不支持了,需要将所配置的dmybatis-spring-boot-autoconfigure和dmybatis-spring-boot-starter,这两个Maven项目中的pom文件中导入编译插件。

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version><configuration><source>17</source><target>17</target></configuration></plugin></plugins></build>

http://www.ppmy.cn/ops/124962.html

相关文章

CentOS 系统上将 Python 更新到 3.9 版本

1.首先&#xff0c;更新系统包并安装必要的开发工具 sudo yum update sudo yum groupinstall "Development Tools" -y sudo yum install openssl-devel bzip2-devel libffi-devel -y 2.下载 Python 3.9 源代码&#xff1a; cd /opt sudo wget https://…

三次握手与四次挥手

一、三次握手 AB之间 都会发送一个syn - ack。 A 先发 syn ,B收到 。 A: 什么都不知道 B:知道A可以发送。 B发送syn-ack,A收到 。 A: 知道B可以收也可以发 , B知道A可以发送。 A发送ack&#xff0c;B收到。 A &#xff1a; 知道B可以收也可以发 , B知道A…

2013年国赛高教杯数学建模C题古塔的变形解题全过程文档及程序

2013年国赛高教杯数学建模 C题 古塔的变形 由于长时间承受自重、气温、风力等各种作用&#xff0c;偶然还要受地震、飓风的影响&#xff0c;古塔会产生各种变形&#xff0c;诸如倾斜、弯曲、扭曲等。为保护古塔&#xff0c;文物部门需适时对古塔进行观测&#xff0c;了解各种变…

Root me CTF all the day靶场ssrf+redis漏洞

Rootme CTF all the day靶场ssrfredis漏洞 一、环境介绍1、漏洞地址2、漏洞介绍 二、 搭建环境三、测试过程3.1 读取系统文件3.2 探测开放的服务器端口(dict协议)3.3 redis未授权访问3.3.1 利用redis来写ssh密钥&#xff08;gopher协议写入&#xff09;3.3.2 利用redis写定时任…

未来已来:AIGC时代为办公方式带来智能化转型与革新

文章目录 一、Excel&#xff1a;从数据处理到智能分析二、Word&#xff1a;从文档编辑到智能写作三、PowerPoint&#xff1a;从幻灯片制作到智能演示四、AI智能办公的挑战与未来《AI智能办公实战108招&#xff1a;ChatGPTWordPowerPointWPS》编辑推荐内容简介作者简介内页插图目…

利用CRITIC客观权重赋权法进行数值评分计算——代码实现

1、前情回顾 之前的文章&#xff0c;我们详细介绍了利用CRITIC客观权重赋权法进行数值评分计算的详细过程&#xff08;不清楚的读者可点击此处的传送门《利用CRITIC客观权重赋权法进行数值评分计算——算法过程》&#xff09;。本篇文章我们展示CRITIC客观权重赋权法的主要实现…

基于SSM顶岗实习管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

深度融合 AR 与 AI 、从 Web2 到 Web3,V3X 定义下一代智能眼镜

01 奇点尚未到来的智能眼镜市场 相对于智能手机、智能手表等设备&#xff0c;智能眼镜很显然是一个更为小众的市场。根据 IDC 数据显示&#xff0c;2023 年全球 AR 眼镜销量为 48 万台&#xff0c;智能眼镜销量为 101 万台。 智能眼镜本身并不是新风口&#xff0c;该赛道最早可…