Spring Boot简介
SpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置。
SpringBoot所具备的特征有:
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
目录
第一个Spring Boot程序
首先创建一个Maven项目,然后根据如下步骤来实现第一个Spring Boot案例
- 在pom文件中引入SpringBoot的父级依赖,并添加启动器依赖
<?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>
<--父级-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<groupId>edu.xatu</groupId>
<artifactId>SpringBoot-00</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<--启动依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
- 编写一个启动类
package edu.xatu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
- 编写一个控制类
package edu.xatu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
@RestController
public class Controller {
@GetMapping("hello")
public String Hello(){
return "Hello springboot!";
}
}
然后运行启动类,并在浏览器访问localhost:8080/hello,如果浏览器中展示Hello springboot!即为成功运行。
需要注意
1. Springboot的启动类是程序运行的入口,需要在类上添加@SpringBootApplication注解。
2. 使用SpringBootApplication注解,启动类可扫描到当前启动类包下的类及其在所有子类,所以这里注意目录结构:
3. 控制类需要@RestController注解,这个注解是@Controller 和 @ResponseBody的结合,表明当前类是控制器且返回的是一组数据,不是页面。源码如下:
4. @GetMapping 注解是 @RequestMapping(method = RequestMethod.GET)的简写。作用是对应查询,表明是一个查询URL映射,比如:@GetMapping(value = “/hello”)来代替@RequestMapping(value=”/hello”,method= RequestMethod.GET)。
Spring Boot配置Druid并使用
-
首先引入Druid依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
- 创建一个数据库,或者只要有一个可连接的数据库就行
- 创建连接参数的配置文件application.properties
jdbc.driverName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/TestDB?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
- 创建一个对应的配置类
import javax.sql.DataSource;
/**
* 工具类 使用数据库配置
* @PropertySource指定配置文件在哪里
*/
@Configuration
@PropertySource("application.properties")
public class jdbcConfig {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverName}")
String driver;
@Value("${jdbc.user}")
String username;
@Value("{jdbc.password}")
String password;
@Bean
public DataSource dataSource(){
DruidDataSource druidSource = new DruidDataSource();
druidSource.setDriverClassName(driver);
druidSource.setUrl(url);
druidSource.setUsername(username);
druidSource.setPassword(password);
return druidSource;
}
}
- 在控制器类中注入数据源,然后启动测试
package edu.xatu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
@RestController
public class Controller {
@Autowired
private DataSource dataSource;
@GetMapping("hello")
public String Hello(){
System.out.println("DataSource: "+dataSource);
return "Hello springboot!";
}
}
- 通过Debug来查看一下成功读取数据库连接信息了呢,而且浏览器端也可以正常打印字符串的。
连接数据库的需求案例中注解说明
1. 在@Configuration注解中是包含@Component注解的,被@Configuration修饰的类被定义为一个Spring容器。
2. @PropertySource()注解是来指定配置文件的位置。
3. @Bean相当于Spring配置文件中的<bean />标签可以在Spring容器中注入一个bean。相当于实例化一个dataSource并交给Spring容器管理。
4. @Value使用方式,@Value(value = “${user.userName}”),这个时候就会把配置文件里的user.userName的值赋值给变量userName。
5. @Autowired注解是使用byType方式的,byType方式是根据属性类型在容器中寻找bean类。
在上面的代码中很明显如果配置文件的内容很多的情况下,@Value注解的使用将会很繁琐。
通过属性注入方式实现
- 使用注解@ConfigurationProperties注解新建一个配置类
package edu.xatu.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String driverName;
private String url;
private String username;
private String password;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- 在pom依赖中添加一段依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
- 将Jdbcproperties对象注入到JdbcConfig
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class jdbcConfig {
@Bean
public DataSource dataSource(JdbcProperties jdbcProperties){
DruidDataSource druidSource = new DruidDataSource();
druidSource.setDriverClassName(jdbcProperties.getDriverName());
druidSource.setUrl(jdbcProperties.getUrl());
druidSource.setUsername(jdbcProperties.getUsername());
druidSource.setPassword(jdbcProperties.getPassword());
return druidSource;
}
- 然后启动程序测试一下,不出意外是依然成功的
需要注意的2个注解
1. @ConfigurationProperties:被标注的类会使用外部文件给bean注入属性
2. @EnableConfigurationProperties作用:启用配置属性类
更优雅的实现
假如一段属性只有以恶个bean需要使用,我们无需将其注入到一个类(Jdbcproperties),直接在需要的地方声明即可。
-
在jdbcConfig中,将Jdbcproperties中刚使用的两个注解@PropertySource("application.properties")和@EnableConfigurationProperties(JdbcProperties.class)可以去掉,然后将@ConfigurationProperties 直接放在方法上:
@Configuration
public class jdbcConfig {
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource(){
return new DruidDataSource();
}
}
- 因为这里不需要@PropertySource("application.properties")所以是不需要配置项类的,将配置项类注释掉
- 然后同样方法启动测试
这样就更加优雅的实现配置Druid数据库啦~