springboot
1.springboot的概念
Spring Boot是由Pivotal團隊提供的全新架構,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該架構使用了特定的方式來進行配置,進而使開發人員不再需要定義樣闆化的配置.通過這種方式,Spring Boot緻力于在蓬勃發展的快速應用開發領域(rapid application development)成為上司者。
2.springboot的相關特點
- 建立獨立的spring應用程式
- 内嵌tomcat,不需要部署
- 簡化maven配置
- 自動配置
-
無需xml相關的配置
spring1.x xml
spring2.x 注解 資料持久層使用xml 業務層使用注解
spring.3.x java配置
spring 4.x java配置
spring 4.x java配置
xml | @configuration |
---|---|
bean标簽的形式 | @Bean |
注意 @Bean用來修飾方法,表明傳回值交由對象管理
** @configuration 用來修飾類表名目前類為配置類.**
3.springboot的限制
-
src/main/java
com.baizhi 主包
entity 子包
dao
service
controller
conf
入口類 注意:入口類必須在主包下和子包同級
-
src/main/resources
springboot的配置檔案 注意:配置檔案名字必須叫application,将配置檔案放置在resources目錄下
- application.yml
- application.yaml
- application.properties
- src/test/java
- src/test/resources
4.使用maven搭建springboot的第一個環境
- 導入jar
<!--父級項目依賴--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <!--web支援的jar springboot的啟動器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--測試支援的jar--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <!-- 隻在test測試裡面運作 --> <scope>test</scope> </dependency>
- 開發入口類
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class,args); } }
-
開發配置檔案 yml的配置檔案需要注意屬性名和屬性值之間有空格的間隔
注意:預設啟動端口号為8080
預設啟動沒有項目名
server: port: 8989 context-path: /springboot
1.注解剖析
1.@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan
//目前的注解是一個組合注解
@Configuration //作用:聲明目前類是一個配置類
@ComponentScan //作用:元件掃描 把一些加有@service @controller @component @repository注解的對象交由工廠管理
@EnableAutoConfiguration //開啟自動配置 datasource sqlsessionFactorybean mapperScanner
2.@RestController //作用:組合注解 @Controller @ResponseBody 聲明目前類為控制器,并且類中所用方法傳回json
注意:springboot預設不支援jsp,預設的視圖層模版為thmyleaf
5.快速搭建springboot應用程式

6.springboot和第三方技術的內建
6.1.mybatis
1.導入jar
<!--整合mybatis-->
<!--mybatis和springboot的整合包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
<!--資料源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.19</version>
</dependency>
<!--資料庫驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--mybatis的核心jar-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
2.相關的配置
注意:springboot采用自動配置 裝配相關對象是以不需要手動配置相關的元件,但是需要聲明動态的參
數,如資料源相關參數
server:
port: 8989
context-path: /springboot
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:oracle:thin:@localhost:1521:xe
driver-class-name: oracle.jdbc.OracleDriver
username: hr
password: hr
mybatis:
mapper-locations: classpath:com/baizhi/mapper/*Mapper.xml
type-aliases-package: com.baizhi.entity
3.手動聲明dao包的位置加入注解@MapperScan
6.2.lombok
1.概念
使java代碼變的更加優雅,以注解的方式代替之前的冗長代碼,底層采用位元組碼技術生成相應方法
2.使用lombok
1.下載下傳lombok相關插件
2.下載下傳lombok的jar
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
3.常用注解的解釋
@Data 注解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法
@Setter :注解在屬性上;為屬性提供 setting 方法
@Getter :注解在屬性上;為屬性提供 getting 方法
@Log4j :注解在類上;為類提供一個 屬性名為log 的 log4j 日志對象
@NoArgsConstructor :注解在類上;為類提供一個無參的構造方法
@AllArgsConstructor :注解在類上;為類提供一個全參的構造方法
@NonNull : 如果給參數加個這個注解 參數為null會抛出空指針異常
@Value : 注解和@Data類似,差別在于它會把所有成員變量預設定義為private final修飾,并且不會生成set方法。
6.3.MBG(mybatis-generator)
1.相關介紹
mybatis的一個插件,根據建立資料庫表,生成實體類,dao,mapper檔案
2.使用
1.導入jar以及插件
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
</dependencies>
<configuration>
<!--配置檔案的路徑 -->
<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
</plugin>
2.添加generator.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="test" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<commentGenerator>
<!-- 這個元素用來去除指定生成的注釋中是否包含生成的日期 false:表示包含 -->
<!-- 如果生成日期,會造成即使修改一個字段,整個實體類所有屬性都會發生變化,不利于版本控制,是以設定為true -->
<property name="suppressDate" value="true" />
<!-- 是否去除自動生成的注釋 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--資料庫連結URL,使用者名、密碼 -->
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@localhost:1521:xe" userId="hr" password="hr">
</jdbcConnection>
<javaTypeResolver>
<!-- This property is used to specify whether MyBatis Generator should
force the use of java.math.BigDecimal for DECIMAL and NUMERIC fields, -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成模型的包名和位置 entity -->
<javaModelGenerator targetPackage="com.baizhi.entity"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成映射檔案的包名和位置 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成DAO的包名和位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.baizhi.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 要生成哪些表 -->
<table tableName="city" domainObjectName="City"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
3.執行 mybatis-generator:generate
6.4.通用mapper 官網:https://github.com/abel533/Mapper/wiki
1.通用mapper和MBG對比
MBG | 通用Mapper |
---|---|
反向生成實體,dao,mapper | 通過實體幫你生成sql語句 |
2.通用mapper的使用
1.導入的jar
<!--通用mapper的啟動器 注意這是mybatis和mybatis啟動器的封裝-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.19</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>oracle</artifactId>
<version>1.0.0</version>
</dependency>
2.配置
server:
port: 8989
context-path: /springboot
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:oracle:thin:@localhost:1521:xe
username: hr
password: hr
driver-class-name: oracle.jdbc.OracleDriver
mybatis:
type-aliases-package: com.baizhi.entity
3.包掃描@MapperScan 注意:不要使用mybatis原生的注解而是采tk.mybatis.spring.annotation.MapperScan
4.mapper接口繼承Mapper
3.通用mapper的相關注解
@Table //用在類上 聲明資料庫的表名
@Id //用在屬性上 聲明目前屬性為主鍵
@Column(name ="username") //作用在屬性上 用來指定資料庫中的字段名稱
//注意:建議使用駝峰命名法 資料庫中以下劃線分割如 userage 實體類中要使用駝峰規則如 userAge
//主鍵政策 兩種形式分别是oracle 和 mysql
//oracle
@KeySql(sql = "select sm_user_seq.nextval from dual", order = ORDER.BEFORE)
//mysql
@KeySql(useGeneratedKeys = true)
@Transient //用在屬性上 作用聲明目前屬性不是資料庫中的列
// 分頁 RowBounds rowBounds=new RowBounds(4,4); 第一個參數是起始下标 第二個參數是每頁的條數
6.5.spirngboot內建jsp
1.導入jar
<!-- 給内嵌tomcat提供jsp解析功能的jar-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2.修改springboot配置的視圖解析器
spring:
mvc:
view:
prefix: /
suffix: .jsp
3.以插件形式啟動 官方提供的插件
注意:由于内嵌tomcat預設不支援頁面熱部署的功能需要添加相關的配置
server:
jsp-servlet:
init-parameters:
development: true
6.6.springboot中需要處理的小細節
1.亂碼
1.由于springboot啟動其中已經配置了編碼過濾器,源碼如下,并且預設值為UTF-8,是以不需要配置
@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
2.如果配置配置項如下
spring:
http:
encoding:
charset: utf-8
force: true
2.檔案上傳
1.springboot預設裝配了檔案處理器,源碼如下 預設單個檔案大小為1MB,一次請求攜帶的檔案大小為10MB
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
return multipartResolver;
}
2.自定義配置
spring:
http:
multipart:
max-file-size: 10MB
max-request-size: 100MB
3.日期格式如何接受
1.方法1:在實體類上加上注解
2.方法2:全局配置,配置yaml
#配置Jackson時間格式轉換
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
4.靜态資源處理
1.不需要處理
get請求優先找靜态資源,找controller
post請求直接找controller
5.測試
1.導入測試相關的啟動器,預設內建的junit是以無需再次導入junit的jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.注解
@Runwith(SpringRunner.class) //啟動spring的工廠
@SpringbootTest //開啟自動配置,并且裝配項目中相關bean,如dao,service,controller
6.配置檔案切分
1.由于實際開發時需要生産環境和測試環境,為了減少測試環境上線時頻繁修改配置檔案的問題,可以做配置檔案的切分,主配置檔案中主要配置公共的參數,小配置檔案中配置獨立的參數
2.如何選擇激活哪個配置檔案
spring:
profiles:
active: test
7.fastjson的內建 将類型轉換器交由工廠管理
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
2.相關注解
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
6.7.springboot內建logback
6.7.1.log4j.properties
1.日志的級别:debug—info—warn–error 日志級别越低列印日志量越多,越詳細
2.日志的分類: 父日志(根日志) 控制全局日志
子日志 某個包中的日志 子日志優先級高于父日志
3.Appender 為日志輸出目的地,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(檔案),
org.apache.log4j.DailyRollingFileAppender(每天産生一個日志檔案),
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候産生一個新的檔案),
org.apache.log4j.WriterAppender(将日志資訊以流格式發送到任意指定的地方)
4.Layout:日志輸出格式,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志資訊的級别和資訊字元串),
org.apache.log4j.TTCCLayout(包含日志産生的時間、線程、類别等等資訊)
5.列印參數: Log4J采用類似C語言中的printf函數的列印格式格式化日志資訊,如下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出産生該日志事件的線程名
%n 輸出一個回車換行符,Windows平台為“\r\n”,Unix平台為“\n”
%d 輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},輸出類似:2002年10月18日 22 : 10 : 28 , 921
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java: 10 )
6.7.2.logback.xml
1.由于springboot內建了logback是以不需要引入jar直接導入配置檔案即可
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern> [%p] [%d{yyyy-MM-dd HH:mm:ss}] %m %n</pattern>
</layout>
</appender>
<root level="info">
<appender-ref ref="stdout"/>
</root>
<logger name="com.baizhi.mapper" level="DEBUG"/>
</configuration>
7.springboot中的屬性注入
7.1.spring的屬性注入方式
@Configuration
@PropertySource(value = "classpath:jdbc.properties")
public class JavaConf {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driver}")
String driver;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(url);
druidDataSource.setDriverClassName(driver);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
7.2.springboot的注入形式
1.第一種屬性注入方式
聲明配置屬性類
@ConfigurationProperties(prefix = "jdbc")
public class JDBCProp {
String url;
String driver;
String username;
String password;
}
在相關配置類中引入目前屬性類
@EnableConfigurationProperties(value = JDBCProp.class)
public class JavaConf {
@Autowired
JDBCProp jdbcProp;
}
2.第二種注入方式 注意:配置檔案中的屬性必須和目前對象屬性保持一緻
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
注意:通過屬性注入的方式可以修改容器中的bean
7.2springboot 自動裝配原理
springboot通過啟動器的形式将一些必須建立的bean先建立出來,比如視圖解析器,處理器擴充卡,處理器映射器,後續開發者可以通過手工配置bean的形式覆寫原來的對象,或者可以通過更簡單的屬性注入的方式修改該執行個體.
8.idea中的debug調試
1.使用方式 在相關的類上标注斷點,以斷點模式啟動
如果想執行下一步操作, f8
結束目前的斷點,或者是下一個斷點,f9
進入方法體,f7
跳出方法體shift+f8
9.mybatis的分頁插件之pagehelper
1.導入pagehelper的啟動器
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.2</version>
</dependency>
第一個參數為 頁碼 第二個參數為 每頁顯示多少條
PageHelper.startPage(1,3);
List<User> users = userMapper.selectAll();
turn druidDataSource;
}
注意:通過屬性注入的方式可以修改容器中的bean
###### 7.2springboot 自動裝配原理
springboot通過啟動器的形式将一些必須建立的bean先建立出來,比如視圖解析器,處理器擴充卡,處理器映射器,後續開發者可以通過手工配置bean的形式覆寫原來的對象,或者可以通過更簡單的屬性注入的方式修改該執行個體.
## 8.idea中的debug調試
1.使用方式 在相關的類上标注斷點,以斷點模式啟動
```java
如果想執行下一步操作, f8
結束目前的斷點,或者是下一個斷點,f9
進入方法體,f7
跳出方法體shift+f8
9.mybatis的分頁插件之pagehelper
1.導入pagehelper的啟動器
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.2</version>
</dependency>
第一個參數為 頁碼 第二個參數為 每頁顯示多少條
PageHelper.startPage(1,3);
List<User> users = userMapper.selectAll();