一、配置檔案

SpringBoot除了可以在全域性編寫一個properties配置檔案外,還可以使用yaml作為配置檔案

新建一個類

@ConfigurationProperties(prefix = "person")
@Component
@Data
public class Person {
private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salarys;
}

編寫yaml配置檔案

person:
username: ss
boss: true
Date: 2019/7/8
age: 20
interests: [ylc,ww]
animal:
- 籃球
- 足球
- 羽毛球
score: {English: 99,math: 66,chinese: 100}
salarys:
- 99.9
- 12.3
- 45.0

發起請求

@Autowired
Person person; @RequestMapping("/GetPerson")
public Person getPerson()
{
return person;
}

單引號會將/n作為字串輸出,雙引號會將字串作為換行輸出,雙引號會轉義

properties配置檔案優先順序大於yaml

讓自定義的類和配置檔案繫結一般有提示可以引入下包,可以更方便的開發

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

二、Web開發

先新建一個自動配置的SpringBoot專案

靜態資源訪問

只要靜態資源放在類路徑(main)下: /static(or/publicor/resourcesor/META-INF/resources`

訪問 : 當前專案根路徑/ + 靜態資源名

原理:當有控制器的情況下,請求會先找Controller處理,沒有找到就找靜態資源處理器,如果靜態資源也找不到返回404

一般專案相會指定靜態資源訪問路徑字首:

application.yaml

spring:
mvc:
static-path-pattern: /res/**

還可以指定靜態資源的目錄:

  web:
resources:
static-locations: [classpath:/Picture/]

歡迎頁支援

在靜態資源路徑下 index.html,如果配置靜態資源能訪問字首就會導致index.html頁面不能被訪問

自定義 Favicon

歡迎頁圖示:預設在static下引入favicon.ico圖示就可以實現

普通引數和基本註解

1.1 @PathVariable

用於接收RestFul風格的引數,路徑變數

@RestController
public class HelloController {
//restFul風格
@GetMapping("/hello/{name}")
public Map<String,String> Hello(@PathVariable("name") String name)
{
Map<String,String> map = new HashMap<>();
map.put("name",name);
return map;
}
}

還可以用一個Map集合全部接收出來

@GetMapping("/hello/{name}/age/{age}")
public Map<String,Object> Hello2(@PathVariable Map<String,String> pv)
{
Map<String,Object> map = new HashMap<>();
map.put("pv",pv);
return map;
}

1.2 @RequestHeader

用於獲取指定請求頭

@GetMapping("/hello/{name}")
public Map<String,String> Hello3(@PathVariable("name") String name,@RequestHeader("User-Agent") String length )
{
Map<String,String> map = new HashMap<>();
map.put("name",name);
map.put("User-Agent",length);
return map;
}

獲取全部請求頭,把頭部引數用一個Map接收

@GetMapping("/hello/{name}")
public Map<String,Object> Hello3(@PathVariable("name") String name,@RequestHeader Map<String,String> pv )
{
Map<String,Object> map = new HashMap<>();
map.put("pv",pv);
return map;
}

1.3 @RequestParam

獲取指定請求引數

@GetMapping("/hello")
public Map<String,Object> Hello3(@RequestParam("name") String name,@RequestParam("age") Integer age )
{
Map<String,Object> map = new HashMap<>();
map.put("name",name);
map.put("age",age);
return map;
}

獲取全部引數

@GetMapping("/hello2")
public Map<String,Object> Hello4(@RequestParam Map<String,String> params )
{
Map<String,Object> map = new HashMap<>();
map.put("params",params);
return map;
}

1.4 @CookieValue

獲取指定的Cookie值

@GetMapping("/GetCookie")
public Map<String,Object> Hello5(@CookieValue("_ga") String _ga )
{
Map<String,Object> map = new HashMap<>();
map.put("_ga",_ga);
return map;
}

獲取Cookie

@GetMapping("/GetCookie")
public Map<String,Object> Hello5(@CookieValue("_ga") Cookie cookie )
{
Map<String,Object> map = new HashMap<>();
map.put("cookie",cookie);
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
return map;
}
1.5 @RequestBody

獲取請求體,只有Post請求才有請求體,表單提交

<form action="/save" method="post">
使用者名稱:<input name="username"/>
密碼:<input name="pwd"/>
<input type="submit" value="提交">
</form>
 @PostMapping("/save")
public Map<String,Object> PostMethod(@RequestBody String content)
{
Map<String,Object> map = new HashMap<>();
map.put("content",content);
return map;
}

1.6 @RequestAttribute

獲取request的屬性

@Controller
public class TextController { @GetMapping("/goto")
public String goToPage(HttpServletRequest request)
{
request.setAttribute("msg","成功");
return "forward:/success";
} @ResponseBody
@GetMapping("/success")
public Map<String,Object> Success(HttpServletRequest request)
{
Object msg = request.getAttribute("msg");
Map<String,Object> map = new HashMap<>();
map.put("msg",msg);
return map;
}
}

傳送請求響應成功,利用轉發把資訊傳送到成功頁面

檢視解析和模板引擎

Web原生元件注入

1.1 使用Selvlet API

Servlet

在主方法指定Servlet放置的位置

//servlet掃描的位置
@ServletComponentScan(basePackages = "com.ylc")
@SpringBootApplication
public class SpringBootWebApplication { public static void main(String[] args) {
SpringApplication.run(SpringBootWebApplication.class, args);
}
}

編寫Servlet

@WebServlet(urlPatterns = "/My")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("6666");
}
}

Filter
@Slf4j
@WebFilter(urlPatterns = {"/public/*"})
public class MyFilter implements Filter {
//filter初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("Filter初始化");
} @Override
public void destroy() {
log.info("Filter銷燬");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("Filter過濾");
filterChain.doFilter(servletRequest,servletResponse);
}
}

訪問public下的都會被攔截

Listener
@Slf4j
@WebListener
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
log.info("MyListener監聽到專案初始化");
} @Override
public void contextDestroyed(ServletContextEvent sce) {
log.info("MyListener監聽到專案完成");
}
}

1.2 RegistrationBean Springboot中注入元件

ServletRegistrationBean、FilterRegistrationBean、 ServletListenerRegistrationBean

//保證元件始終是單例項
@Configuration(proxyBeanMethods = true)
public class MyRegistConfig { @Bean
public ServletRegistrationBean myServlet()
{
MyServlet myServlet=new MyServlet();
return new ServletRegistrationBean(myServlet,"/My");
} @Bean
public FilterRegistrationBean myFilter()
{
MyFilter myFilter=new MyFilter();
//第一種
//這裡只有通過myServlet的請求下才會顯示666 才會被過濾器找到
//return new FilterRegistrationBean(myFilter,myServlet());
//第二種 自己定義過濾url
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean(myFilter);
filterRegistrationBean.setUrlPatterns(Arrays.asList("/public/*"));
return filterRegistrationBean;
} @Bean
public ServletListenerRegistrationBean myLister()
{
MyListener myListener=new MyListener();
return new ServletListenerRegistrationBean(myListener);
}
}

此方法同理

定製化

Web應用 編寫一個配置類實現WebMvcConfigurer 即可定製化web功能,裡面加@Bean給容器中再擴充套件一些元件

@EnableWebMvc + 實現WebMvcConfigurer介面 —— @Bean 可以全面接管SpringMVC,所有規則全部自己重新配置; 實現定製和擴充套件功能

三、資料訪問

資料來源配置

匯入JDBC場景

   <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

場景裡面已經匯入了資料來源、JDBC、事務,還需要匯入資料庫的驅動,因為官方不知道我們接下要操作什麼資料庫

預設版本:<mysql.version>8.0.22</mysql.version>

 資料庫版本要和驅動版本對應
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
//重新宣告版本(maven的屬性的就近優先原則)
<properties>
<java.version>1.8</java.version>
<mysql.version>5.1.49</mysql.version>
</properties>

分析自動配置

  • DataSourceAutoConfiguration : 資料來源的自動配置

  • 修改資料來源相關的配置:spring.datasource

  • 資料庫連線池的配置,是自己容器中沒有DataSource才自動配置的

  • 底層配置好的連線池是:HikariDataSource

	@Configuration(proxyBeanMethods = false)
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
protected static class PooledDataSourceConfiguration
  • DataSourceTransactionManagerAutoConfiguration: 事務管理器的自動配置

  • JdbcTemplateAutoConfiguration: JdbcTemplate的自動配置,可以來對資料庫進行crud

  • JndiDataSourceAutoConfiguration: jndi的自動配置

  • XADataSourceAutoConfiguration: 分散式事務相關的

修改配置

spring:
datasource:
url: jdbc:mysql://waiwanga.mysql.rds.aliyuncs.com:3306/student
username: root
password: XXXX
driver-class-name: com.mysql.jdbc.Driver
@SpringBootTest
@Slf4j
class SpringBootWebApplicationTests { @Autowired
JdbcTemplate jdbcTemplate; @Test
void contextLoads() {
Long aLong = jdbcTemplate.queryForObject("select count(*) from student", Long.class);
log.info("記錄總數:{}",aLong);
}
}

使用Druid資料來源

官方文件:https://github.com/alibaba/druid

引入jar包

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>

編寫一個數據源配置類和配置檔案關聯起來

@Configuration
public class MyDataSourseConfig { //把DruidDataSource屬性跟配置檔案繫結起來
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource()
{
return new DruidDataSource();
}
}

配置檔案

spring:
datasource:
url: jdbc:mysql://waiwanga.mysql.rds.aliyuncs.com:3306/student
username: root
password: xxxx
driver-class-name: com.mysql.cj.jdbc.Driver

測試類

@SpringBootTest
@Slf4j
class SpringBootWebApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
DataSource dataSource; @Test
void contextLoads() {
Long aLong = jdbcTemplate.queryForObject("select count(*) from student", Long.class);
log.info("記錄總數:{}",aLong);
log.info("資料來源"+dataSource.getClass());
}
}
檢視監控頁

訪問http://localhost:8080/druid/

@Configuration
public class MyDataSourseConfig { //把DruidDataSource屬性跟配置檔案繫結起來
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource()
{
return new DruidDataSource();
} //配置監控功能
@Bean
public ServletRegistrationBean servletRegistrationBean()
{
StatViewServlet statViewServlet=new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
return registrationBean;
}
}

開啟監控功能

需要在DataSourse中Filter引數配置stat

@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource dataSource=new DruidDataSource();
//加入監控功能
dataSource.setFilters("stat");
return dataSource;
}

執行sql

@Autowired
JdbcTemplate jdbcTemplate; @ResponseBody
@GetMapping("/sql")
public String getSql()
{
Long aLong = jdbcTemplate.queryForObject("select count(*) from student", Long.class);
return aLong.toString();
}

檢視監控資訊

開啟URl監控

WebStatFilter用於採集web-jdbc關聯監控的資料

exclusions配置經常需要排除一些不必要的url,比如.js,/jslib/等等。配置在init-param中。比如:

 	<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>

根據官方xml,寫成註解的方式

@Bean
public FilterRegistrationBean webstatFilter()
{
WebStatFilter webStatFilter=new WebStatFilter();
FilterRegistrationBean<WebStatFilter> filterRegistrationBean=new FilterRegistrationBean<>(webStatFilter);
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}

可以檢視每次請求的資訊

開啟防火牆

使用預設配置的WallFilter

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
...
<property name="filters" value="wall"/>
</bean>

根據官方文件,只需要在之前的filters中再新增一個引數wall

開啟Session監控

需要配置Servlet的 loginUsernameloginPassword這兩個初始引數

再次重新整理進入

登陸上就可以看到Session資訊

引入官方starter方式

引入druid-starter

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>

分析自動配置

  • 擴充套件配置項 spring.datasource.druid

  • DruidSpringAopConfiguration.class, 監控SpringBean的;配置項:spring.datasource.druid.aop-patterns

  • DruidStatViewServletConfiguration.class, 監控頁的配置:spring.datasource.druid.stat-view-servlet;預設開啟

  • DruidWebStatFilterConfiguration.class, web監控配置;spring.datasource.druid.web-stat-filter;預設開啟

  • DruidFilterConfiguration.class}) 所有Druid自己filter的配置

#spring:
# mvc:
# static-path-pattern: /res/**
# web:
# resources:
# static-locations: [classpath:/Picture/]
spring:
datasource:
url: jdbc:mysql://waiwanga.mysql.rds.aliyuncs.com:3306/student
username: root
password: xxxxx
driver-class-name: com.mysql.cj.jdbc.Driver druid:
aop-patterns: com.ylc.* #監控SpringBean
filters: stat,wall # 底層開啟功能,stat(sql監控),wall(防火牆) stat-view-servlet: # 配置監控頁功能
enabled: true
login-password: 123
login-username: admin
reset-enable: true web-stat-filter: # 監控web
enabled: true
urlPattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' filter:
stat: # 對上面filters裡面的stat的詳細配置
slow-sql-millis: 1000
logSlowSql: true
enabled: true
wall:
enabled: true
config:
drop-table-allow: false

SpringBoot配置示例

https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

配置項列表

https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8

整合Mybatis操作

官方文件:https://github.com/mybatis

引入jar包

  <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

編寫全域性配置檔案

spring:
datasource:
url: jdbc:mysql://waiwanga.mysql.rds.aliyuncs.com:3306/student
username: xxx
password: XXX
driver-class-name: com.mysql.cj.jdbc.Driver mybatis:
#config-location: classpath:Mybatis/mybatis-config.xml
mapper-locations: classpath:mapper/*.xml
configuration: #指定Mybatis全域性配置檔案中的配置項 有了這個就不需要mybatis-config.xml
map-underscore-to-camel-case: true

編寫實體類

@Data
public class Student {
public String name;
public int id;
public int getId;
}

編寫Mapper介面

@Mapper
public interface StudentMapper {
//獲取所有學生
List<Student> getStudent();
}

在resourse資料夾下編寫mapper檔案

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ylc.springbootweb.mapper.StudentMapper"> <select id="getStudent" resultType="com.ylc.springbootweb.bean.Student">
select * from student
</select>
</mapper>

編寫StudentService

@Service
public class StudentService { @Autowired
StudentMapper studentMapper; public List<Student> getStudent()
{
return studentMapper.getStudent();
}
}

編寫控制器

@Controller
@ResponseBody
public class StudentController { @Autowired
StudentService studentService; @GetMapping("/getStu")
public List<Student> getStudent()
{
List<Student> students=studentService.getStudent();
for (Student student : students) {
System.out.println(student);
}
return students;
}
}

注意mapper.xml檔案和Mybatis配置檔案不能放在同一層級,不然系統識別不了哪個是配置檔案

整合Mybatis-Plus

引入Mybatis-Plus jar包

        <dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>

在SpringBootWebApplication中用@MapperScan掃描Mapper介面

繼承BaseMapper實現crud

public interface PlusStudentMapper<T> extends BaseMapper<Student> {

}

測試

@Autowired
PlusStudentMapper plusStudentMapper;
@Test
void plusText()
{
Student student = (Student) plusStudentMapper.selectById(2);
System.out.println(student);
}

Crud操作

編寫Mapper介面

public interface StudentMapper<T> extends BaseMapper<Student> {

}

編寫service介面

public interface TService extends IService<Student> {

}

編寫service實現類

@Service
public class StudentTServiceImp extends ServiceImpl<StudentMapper<Student>,Student> implements TService { }

測試類

@Autowired
StudentTServiceImp serviceImp;
@Test
void Crud()
{
List<Student> list = serviceImp.list();
for (Student student : list) {
System.out.println(student);
}
}