簡介:
springboot整合了springframework,整合了許多配置,讓我們能夠快速創建一個以springframework為基礎的項目。
問題:
到目前為止,你已經學習了多種配置Spring程序的方式。但是無論使用XML、注解、Java配置類還是他們的混合用法,你都會覺得配置文件過于復雜和繁瑣,讓人頭疼!
解決:
SpringBoot 幫我們簡單、快速地創建一個獨立的、生產級別的 Spring 應用(說明:SpringBoot底層是Spring),大多數 SpringBoot 應用只需要編寫少量配置即可快速整合 Spring 平臺以及第三方技術!
SpringBoot總結:簡化開發,簡化配置,簡化整合,簡化部署,簡化監控,簡化運維。
快速入門
父工程的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>
??? <parent>
??????? <!-- springboot(將springboot提供的基礎包做父工程) -->
??????????? <groupId>org.springframework.boot</groupId>
??????????? <artifactId>spring-boot-starter-parent</artifactId>
??????????? <version>3.0.5</version>
??? </parent>
??? <groupId>com.atguigu</groupId>
??? <artifactId>springboot-base-quick-01</artifactId>
??? <version>1.0-SNAPSHOT</version>
??? <!-- 導入對應的啟動器 -->
??? <dependencies>
??????? <dependency>
??????????? <groupId>org.springframework.boot</groupId>
??????????? <artifactId>spring-boot-starter-web</artifactId>
??????? </dependency>
??? </dependencies>
</project>
啟動類
/**
?* 創建一個啟動類
?* 步驟:
?* 在該類上加上@SpringBootApplication代表此類是啟動類
?*??????????????? 該注解的作用:
?*??????????????? ①代表此類事配置類,
?*??????????????? ②自動加載配置 @EnableAutoConfiguration 自動加載其他配置類
?*??????????????? ③@ComponentScan 默認會掃描當前包/子包的注解
?* 在方法中通過 SpringApplication調用run()方法,傳入當前類.class與args
?*??????????????? 作用:
?*??????????????? ①創建ioc容器
?*??????????????? ②啟動內置的web服務
?*??????????????? 當運行該類時,自動創建ioc容器,啟動tomcat服務器軟件
?* 只要在啟動類相同的包或子包下加的注解就會被自動掃描
?*/
@SpringBootApplication//啟動類
public class Main {
??? public static void main(String[] args) {
??????? SpringApplication.run(Main.class,args);//自動創建ioc容器,啟動tomcat服務器軟件
??? }
}
總結:
1. 為什么依賴不需要寫版本?
??? - 每個boot項目都有一個父項目`spring-boot-starter-parent`
??? - parent的父項目是`spring-boot-dependencies`
??? - 父項目 **版本仲裁中心**,把所有常見的jar的依賴版本都聲明好了。
??? - 比如:`mysql-connector-j`
在父工程中已經做了依賴管理,所以在導入依賴時就不需要寫版本了。
的
2 啟動器(starter)是什么?(整合web開發需要的所有依賴)
(我們的項目需要許多依賴web,servlet jackson等等,啟動器會幫我們自動導好)
Spring Boot提供了一種叫做Starter的概念,它是一組預定義的依賴項集合,旨在簡化Spring應用程序的配置和構建過程。Starter包含了一組相關的依賴項,以便在啟動應用程序時自動引入所需的庫、配置和功能。
主要作用如下:
1. 簡化依賴管理
2. 自動配置
3. 提供約定優于配置
4. 快速啟動和開發應用程序
5. 模塊化和可擴展性
3 @SpringbootApplication的作用
@SpringBootApplication添加到啟動類上,是一個組合注解,他的功效有具體的子注解實現!
@SpringBootApplication注解是Spring Boot框架中的核心注解,它的主要作用是簡化和加速Spring Boot應用程序的配置和啟動過程。
具體而言,@SpringBootApplication注解起到以下幾個主要作用:
1. 自動配置:@SpringBootApplication注解包含了@EnableAutoConfiguration注解,
2. 組件掃描:@SpringBootApplication注解包含了@ComponentScan注解
3. 聲明配置類:@SpringBootApplication注解本身就是一個組合注解,它包含了@Configuration注解
總的來說,@SpringBootApplication注解的主要作用是簡化Spring Boot應用程序的配置和啟動過程。它自動配置應用程序、掃描并加載組件,并將配置和啟動類合二為一,簡化了開發者的工作量,提高了開發效率。
統一配置管理??
?application.properties(統一文件):
?所有的配置文件都統一寫在一個文件中,該文件的名稱為application.properties或application.yml,且該文件必須放在src/main/resources目錄下。這是因為src/main/resources目錄是Spring Boot默認的類路徑(classpath),配置文件會被自動加載并可供應用程序訪問。
注意:
①固定的key配置一些參數
②自定義key
代碼舉例:
application.properties文件:
#使用springboot提供的配置,修修改程序的參數,注意:key是固定的
server.servlet.context-path=/boot
#自定義配置
#如何讀取引用配置文件:直接在controller類中聲明接收該值的屬性,然后用@value為其賦值即可
lq.name=劉清
lq.age=19
讀取:
controller類
??? @Value("${lq.name}")
??? private String name;
??? @Value("${lq.age}")
??? private int age;
application.yaml配置介紹和使用
properties方式
web 設置服務器的端口號 項目根路徑
key=value
出現的問題:
因為要為所有框架提供配置參數的位置,又要保證key不重復,所以key就會特別長-----------一般不推薦使用
推薦使用以.yml或.yaml結尾的application文件
yaml方式
#yaml是層次,可以繼承的配置文件格式
#例如:
server:
? port: 8080
? servlet:
??? context-path: /boot
lq:
? info:
??? age;18 #注意:key:空格value
#集合配置
? gfs:
??? - 高圓圓
??? - 范冰冰
??? - 二狗子
#yaml語法:
#? 1. 數據結構用樹形結構呈現,通過縮進來表示層級,
#? 2. 連續的項目(集合)通過減號 ” - ” 來表示
#? 3. 鍵值結構里面的key/value對用冒號 ” : ” 來分隔。
#? 4. YAML配置文件的擴展名是yaml 或 yml
讀取配置文件
讀取方式和properties一致
#YAML格式相對于:properties文件具有更好的層次結構表示、自我描述性、注釋支持、多行文本表示、復雜數據類型支持和更好的可讀性。
批量配置文件讀取
/**
?lq:
?info:
?password:123456?? #注意:key:空格value
?username:liuqing
?gfs:
?- 高圓圓
?- 范冰冰
?- a
?- b
?* 讀取配置文件的
?*?? 方式一:使用@value注解
?*???? 直接在屬性上添加,注意:@value是為組件屬性賦值的,所以該類一定要加入ioc容器
?*???? ①@Value(key必須寫全了)
?*???? ②@Value只能讀取單個值
?*?? 方式二:批量讀取
?*?? 在實體類上添加一個@ConfigurationProperties(prefix = "lq.info")里面填通用的前綴
?*?? 優勢:①方便不用一個一個讀取
?*??????? ??????②可以給集合類型賦值
?*/
@Component
@Data
@ConfigurationProperties(prefix = "lq.info")
public class User {
??? private String password;
??? private String username;
??? private List<String> gfs;
}
多環境配置與激活?
1. 屬性文件分離:將應用程序的配置參數分離到不同的屬性文件中,每個環境對應一個屬性文件。例如,可以創建`application-dev.properties`、`application-prod.properties`和`application-test.properties`等文件。在這些文件中,可以定義各自環境的配置參數,如數據庫連接信息、端口號等。然后,在`application.properties`中通過`spring.profiles.active`屬性指定當前使用的環境。Spring Boot會根據該屬性來加載對應環境的屬性文件,覆蓋默認的配置。
2. YAML配置文件:與屬性文件類似,可以將配置參數分離到不同的YAML文件中,每個環境對應一個文件。例如,可以創建`application-dev.yml`、`application-prod.yml`和`application-test.yml`等文件。在這些文件中,可以使用YAML語法定義各自環境的配置參數。同樣,通過`spring.profiles.active`屬性指定當前的環境,Spring Boot會加載相應的YAML文件。
例如:
其他文件名---------application-key.yml
application-dev.yml(開發)
spring:
? jdbc:
??? datasource:
????? driverClassName: com.mysql.cj.jdbc.Driver
????? url: jdbc:mysql:///dev
????? username: root
????? password: root
application-test.yml(測試)
spring:
? jdbc:
??? datasource:
????? driverClassName: com.mysql.cj.jdbc.Driver
????? url: jdbc:mysql:///test
????? username: root
????? password: root
application-prod.yml(生產)
spring:
? jdbc:
??? datasource:
????? driverClassName: com.mysql.cj.jdbc.Driver
????? url: jdbc:mysql:///prod
????? username: root
????? password: root
環境激活
spring:
? profiles:
??? active: dev(填的是文件名中的key)
注意;
如果設置了spring.profiles.active,并且和application有重疊屬性,以active設置優先。
如果設置了spring.profiles.active,和application無重疊屬性,application設置依然生效!
springmvc整合與配置
web相關配置
1.`server.port`: 指定應用程序的HTTP服務器端口號。
2. `server.servlet.context-path`: 設置應用程序的上下文路徑。這是應用程序在URL中的基本路徑。默認情況下,上下文路徑為空。
3. `spring.mvc.view.prefix`和`spring.mvc.view.suffix`: 這兩個屬性用于配置視圖解析器的前綴和后綴
4. `spring.resources.static-locations`: 配置靜態資源的位置。默認情況下,Spring Boot會將靜態資源放在classpath:/static目錄下(故而一般不用配置)
5. `spring.http.encoding.charset`和`spring.http.encoding.enabled`: 這兩個屬性用于配置HTTP請求和響應的字符編碼。
例如:
#springmvc相關的配置
#一般在server下設置
server:
? port: 80 ?#設置端口號,默認是8080
? servlet:
??? context-path: /boot #設置項目根路徑
spring:
? mvc:
??? view: #視圖解析器配置
????? prefix: /WEB-INF/views/ ?#前綴名
????? suffix: .jsp? #后綴名
? web:
??? resources:
????? static-locations: classpath:/webapp ?#配置靜態資源文件夾
???? ?#一旦配置了,那么默認的靜態資源文件夾就無法訪問了
???? ?#外部訪問金泰資源的時候無需寫靜態資源文件夾(直接寫文件名即可,要帶上后綴)
靜態資源處理:
在springboot中就定義了靜態資源的默認查找路徑
默認的靜態資源路徑為:
* *· classpath:/META-INF/resources/**
**· classpath:/resources/**
**· classpath:/static/**
**· classpath:/public/**
我們只要靜態資源放在這些目錄中任何一個,SpringMVC都會幫我們處理。 我們習慣會把靜態資源放在classpath:/static/ 目錄下。在resources目錄下創建index.html文件
在springboot下springmvc中的東西還是正常使用
springmvc的整合還是創建一個配置類實現WebMvcConfigurer
攔截器,全局異常類像之前一樣創建;
druid池與兼容性處理
所需要導入的依賴:
??????????? <!--? web開發的場景啟動器 -->
??????????? <dependency>
??????????????? <groupId>org.springframework.boot</groupId>
??????????????? <artifactId>spring-boot-starter-web</artifactId>
??????????? </dependency>
??????????? <!-- 數據庫相關配置啟動器 jdbctemplate 事務相關-->
??????????? <dependency>
??????????????? <groupId>org.springframework.boot</groupId>
??????????????? <artifactId>spring-boot-starter-jdbc</artifactId>
??????????? </dependency>
??????????? <!-- druid啟動器的依賴? -->
??????????? <dependency>
??????????????? <groupId>com.alibaba</groupId>
??????????????? <artifactId>druid-spring-boot-3-starter</artifactId>
??????????????? <version>1.2.18</version>
??????????? </dependency>
??????????? <!-- 驅動類-->
??????????? <dependency>
??????????????? <groupId>mysql</groupId>
??????????????? <artifactId>mysql-connector-java</artifactId>
??????????????? <version>8.0.28</version>
??????????? </dependency>
??????????? <dependency>
??????????????? <groupId>org.projectlombok</groupId>
??????????????? <artifactId>lombok</artifactId>
??????????????? <version>1.18.28</version>
??????????? </dependency>
所配置的信息:application.yaml文件
spring:
? datasource:
??? type: com.alibaba.druid.pool.DruidDataSource? #使用druid連接池
#??? username: 賬號
#??? password: 密碼? #如果是springboot2整合druid連接池,可使用此信息配置賬號和密碼,springboot3不行
????? # Druid的其他屬性配置 springboot3整合情況下,數據庫連接信息必須在Druid屬性下!
??? druid:
??????? url: jdbc:mysql://localhost:3306/day01
??????? username: root
??????? password: root
??????? driver-class-name: com.mysql.cj.jdbc.Driver
?????? ?# 初始化時建立物理連接的個數
??????? initial-size: 5
??????? # 連接池的最小空閑數量
??????? min-idle: 5
??????? # 連接池最大連接數量
??????? max-active: 20
?????? ?# 獲取連接時最大等待時間,單位毫秒
??????? max-wait: 60000
?????? ?# 申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
??????? test-while-idle: true
?????? ?# 既作為檢測的間隔時間又作為testWhileIdel執行的依據
??????? time-between-eviction-runs-millis: 60000
??????? # 銷毀線程時檢測當前連接的最后活動時間和當前時間差大于該值時,關閉當前連接(配置連接在池中的最小生存時間)
??????? min-evictable-idle-time-millis: 30000
?????? ?# 用來檢測數據庫連接是否有效的sql 必須是一個查詢語句(oracle中為 select 1 from dual)
??????? validation-query: select 1
??????? # 申請連接時會執行validationQuery檢測連接是否有效,開啟會降低性能,默認為true
??????? test-on-borrow: false
?????? ?# 歸還連接時會執行validationQuery檢測連接是否有效,開啟會降低性能,默認為true
??????? test-on-return: false
??????? # 是否緩存preparedStatement, 也就是PSCache,PSCache對支持游標的數據庫性能提升巨大,比如說oracle,在mysql下建議關閉。
??????? pool-prepared-statements: false
??????? # 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100
??????? max-pool-prepared-statement-per-connection-size: -1
?????? ?# 合并多個DruidDataSource的監控數據
??????? use-global-data-source-stat: true
測試代碼
需求:查詢t_emp表中的所有數據
實體類:Employee略
controller類:
@Controller
@ResponseBody
@RequestMapping("emp")
public class EmployeeController {
??? @Autowired
??? private JdbcTemplate jdbcTemplate;
??? @GetMapping("list")
??? public List<Employee> list(){
??????? //數據庫
??????? String sql="select * from t_emp";
??????? List<Employee> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Employee.class));
??????? return query;
??? }
}
出現問題:
通過源碼分析,druid-spring-boot-3-starter目前最新版本是1.2.18,雖然適配了SpringBoot3,但缺少自動裝配的配置文件,
解決:
需要手動在resources目錄下創建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件內容如下!
??????????????????? com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
mybatis整合與配置
mybatis整合步驟:
1. 導入依賴:在您的Spring Boot項目的構建文件(如pom.xml)中添加MyBatis和數據庫驅動的相關依賴。例如,如果使用MySQL數據庫,您需要添加MyBatis和MySQL驅動的依賴。
2. 配置數據源:在`application.properties`或`application.yml`中配置數據庫連接信息,包括數據庫URL、用戶名、密碼、mybatis的功能配置等。
3. 創建實體類:創建與數據庫表對應的實體類。
4. 創建Mapper接口:創建與數據庫表交互的Mapper接口。
5. 創建Mapper接口SQL實現: 可以使用mapperxml文件或者注解方式
6. 創建程序啟動類
7. 注解掃描:在Spring Boot的主應用類上添加`@MapperScan`注解,用于掃描和注冊Mapper接口。
8. 使用Mapper接口:在需要使用數據庫操作的地方,通過依賴注入或直接實例化Mapper接口,并調用其中的方法進行數據庫操作。
為什么此時的mapper接口與mapper.xml文件的包結構可以不一樣:
之前是批量掃描,按照包去找對應的mapper接口與mapper.xml文件
在springboot場景下會分開配,會在配置文件中指定mapper.xml文件的配置;而接口的位置,會在啟動類上用注解掃描。
代碼舉例:
Application.xml文件
server:
? address: 0.0.0.0? # 允許所有IP訪問
# druid連接池
spring:
? datasource:
??? type: com.alibaba.druid.pool.DruidDataSource
??? druid:
????? url: jdbc:mysql://localhost:3306/mybatis-example
????? username: root
????? password: abc123LQ
????? driver-class-name: com.mysql.cj.jdbc.Driver
#mybatis-徹底拋棄了mybatis-config.xml文件
#mapperxml文件的配置??? setting的配置???? 別名的設置
mybatis:
? mapper-locations: classpath:/mappers/*.xml? #指定mapper.xml文件的位置
? type-aliases-package: com.atguigu.pojo? #給類起別名的設置
? configuration:
??? map-underscore-to-camel-case: true? #開啟駝峰式
??? auto-mapping-behavior: full?? #自動字段映射
??? log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl? #日志輸出
實體類Employee:略
Mapper.xml文件(EmployeeMapper.xml):lue
Controller(EmployeeController類):略
啟動類:
@SpringBootApplication
@MapperScan("com.atguigu.mapper") //指定mapper接口所在的位置,會自動將所有mapper接口的代理對象放到ioc容器
public class Main {
??? public static void main(String[] args) {
??????? SpringApplication.run(Main.class,args);
??????? System.out.println("hello world!");
??? }
}
aop與tx整合
tx整合:
原來:
???? * 給方法添加事務的操作
???? *??????? 0 導入JDBC的依賴
???? *??????? 1 選定我們需要的事務管理器的實現類,在配置類中創建該類的對象,使用注解的方法將該類添加到ioc
???? *???????????????????????? 注意:該組件需要引入連接池的組件
???? *??????? 2 在配置類上加上 @EnableTransactionManagement 表示開啟事務注解
???? *??????? 3 在我們想要添加事務的方法上加上 @Transactional那么該方法就有事務了
?
現在(使用spring-boot后):
因為添加了jbdc的依賴;而SpringBoot項目會自動配置一個 DataSourceTransactionManager,
所以我們只需在方法(或者類)加上 @Transactional 注解,就自動納入 Spring 的事務管理了,
也不需要在配置類加@EnableTransactionManagement//開啟事務注解的支持
???? * 給方法添加事務的操作
???? *??????? 0 導入JDBC的依賴???
???? *??????? 1 選定我們需要的事務管理器的實現類,在配置類中創建該類的對象,使用注解的方法將該類添加到ioc(可以省略)
???? *???????????????????????? 注意:該組件需要引入連接池的組件
???? *??????? 2 在配置類上加上 @EnableTransactionManagement 表示開啟事務注解(可以省略)
???? *??????? 3 在我們想要添加事務的方法上加上 @Transactional那么該方法就有事務了
實現代碼:
service層:
@Service
public class EmployeeService {
??? @Autowired
??? private EmployeeMapper employeeMapper;
??? @Transactional
??? public void delete( ){
??????? int rows=employeeMapper.delete(1);
??????? System.out.println("rows = " + rows);
???? ???int i=1/0;
??? }
}
controller層:
@Controller
@ResponseBody
@RequestMapping("/emp")
public class EmployeeController {
??? @Autowired
??? private EmployeeMapper employeeMapper;
??? @Autowired
??? private EmployeeService employeeService;
??? @GetMapping
??? public List<Employee> query(){
?????? ?employeeService.delete();
??????? return null;
??? }
}
aop整合:
原來:
定義一個增強類(該類要加入ioc),在該類中定義一些方法(通知用@Before/@After…修飾),在用切點表達式指明改通知要作用在那些方法上(execution(…))
現在:
只需要導入依賴;然后直接使用aop注解即可。
不用在配置類添加@EnableAspectJAutoProxy//開啟aspectj注解
代碼舉例:
@Component
@Aspect
public class LogAdvice {
?? ?@Before("execution(* com..service.*.*(..))")
??? public void before(JoinPoint point){
??????? String simpleName = point.getTarget().getClass().getSimpleName();
??????? String name = point.getSignature().getName();
??????? System.out.println("name = " + name);
??????? System.out.println("simpleName = " + simpleName);
??? }
}
直接測試:成功
Springboot3項目打包和運行
添加打包插件:
> 在Spring Boot項目中添加`spring-boot-maven-plugin`插件是為了支持將項目打包成可執行的可運行jar包。如果不添加`spring-boot-maven-plugin`插件配置,使用常規的`java -jar`命令來運行打包后的Spring Boot項目是無法找到應用程序的入口點,因此導致無法運行。
<!--??? SpringBoot應用打包插件-->
<build>
??? <plugins>
??????? <plugin>
??????????? <groupId>org.springframework.boot</groupId>
??????????? <artifactId>spring-boot-maven-plugin</artifactId>
??????? </plugin>
??? </plugins>
</build>
執行打包:
Clean-package
?