了解SpringBoot
什么是SpringBoot?
为什么要学习SpringBoot?
SpringBoot的特点
什么是SpringBoot?
SpringBoot是Spring项目中的一个子工程,与Spring-framework同属于spring产品;用一些固定的方式来构建生产级别的spring应用,被称为搭建程序的脚手架。其最主要的作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。
为什么要学习SpringBoot?
SpringBoot简化了基于Spring的应用开发,只需要run就能创建一个独立的、生产级别Spring应用。SpringBoot为Spring平台第三方提供开箱即用的设置,这样我们就可以简单的开始。多数spring Boot应用只需要很少的spring配置。
SpringBoot特点
SpringBoot主要目标:
- 为所有Spring的开发者提供一个非常快速、广泛接受的入门体验;
- 开箱即用(启动器starter-就是SpringBoot提供的一个jar包),但通过自己设置参数(.properties),即可快速摆脱这种方式。
- 提供了一些大型项目中常见的非功能性特性,如内嵌服务器、安全、指标、健康检测等;
- 绝对没有代码生成,也无需XML配置。
创建spring boot项目
使用向导(web 页面)
- 到spring boot 官网,使用2.1.8版本 jdk8;
- 添加父工程坐标
pom继承依赖,版本在父配置统一管理;
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
添加web启动器
为了让SpringBoot帮我们完成各种自动配置,我们必须引入SpringBoot提供的自动配置依赖,我们成为启动器。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
因为SpringBoot的父工程已经对版本进行了管理,所以我们无需指定版本信息;
这时会看到项目中出现了大量依赖,这些都是SpringBoot根据spring-boot-starter-web
这个依赖自动引入的,而且所有的版本都管理好了,不会再出现冲突。
管理jdk版本
<properties>
<java.version>1.8</java.version>
</properties>
启动类
需要在入口类上加一个注解@SpringBootApplication
,还要加一个main方法,启动springboot;
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class);
}
}
fat jar 打包之后,包含了所有第三方的jar,使用java -jar jar包名
来运行这个jar包;
至此环境就搭建好了,来测试一下。
测试
编写Controller
@RestController
public class HelloWorld {
@GetMapping("/hello")
public String hello(){
return "Hello World";
}
}
Java配置
使用xml配置一个数据库连接池时是这样的。
<!-- 配置连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
这时spring1.0的做法,使用这种传统方法很繁琐,所以spring2中引入了注解开发,也就是使用Java进行配置。
尝试java配置
java配置主要靠java类和一些注解,比较常用的注解有:
@Configuration
:声明一个类作为配置类,代替xml文件;@Bean
:声明在方法上,将方法的返回值加入Bean容器,代替<bean>
标签;@Value
: 属性注入;@PropertySource
:指定外部属性文件;
实例:使用java配置来尝试实现连接池配置
- 首先引入Druid连接池依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
- 创建一个jdbc.properties文件,编写jdbc属性:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=westos
- 编写代码:
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(url);
druidDataSource.setDriverClassName(driverClassName);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
解读:
@Configuration
:声明JdbcConfig是一个配置类;@PropertySource
:指定属性文件的路径时:classpath:jdbc.properties@Value
为属性注入值;- 通过
@Bean
将dataSouce方法声明为一个注册Bean方法,Spring会自动调用该方法,将方法的返回值加入Spring容器中。然后就可以在任意位置通过@Autowried
注入DataSource。
@RestController
public class HelloWorld {
@Autowired
JdbcConfig jdbcConfig;
@GetMapping("/hello")
public String hello(){
DataSource dataSource = jdbcConfig.dataSource();
return "Hello World";
}
}
打个断点debug一下可以看到属性已经设置到连接池。
SpringBoot的属性注入
上述的Java配置中,属性注入使用的是@Value注解,这种方式虽然可行但是不够强大,因为它只能注入基本类型值,不能注入引用类型值。
在SpringBoot中提供一种新的属性注入的方式,支持各种java基本数据类型及复杂类型注入。
- 新建一个类,用来进行属性注入
@ConfigurationProperties(prefix = "jdbc")
@Data
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
}
-
@ConfigurationProperties(prefix = "jdbc")
注解声明当前类为属性读取类,prefix读取属性文件中,浅灰为jdbc的值。 -
在类上定义各个属性,名称必须与属性文件jdbc.后面部分一致;
-
这里要把jdbc.properties名称改为application.properties,这是springBoot默认读取的属性文件名。
-
在JdbcConfig中使用这个属性:
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {
@Bean
public DataSource dataSource(JdbcProperties jdbc){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(jdbc.getUrl());
druidDataSource.setDriverClassName(jdbc.getDriverClassName());
druidDataSource.setUsername(jdbc.getUsername());
druidDataSource.setPassword(jdbc.getPassword());
return druidDataSource;
}
}
- 通过
@EnableConfigurationProperties(JdbcProperties.class)
来声明要使用的JdbcProperties
这个类的对象。 - 然后通过以下的方式注入JdbcProperties
- @Autowired注入
@Autowired private JdbcProperties prop;
- 构造函数注入;
private JdbcProperties prop; pubic JdbcConfig(Jdbcproperties prop){ this.prop=prop; }
- 声明有@Bean的方法参数注入
@Bean public DataSource dataSource(JdbcProperties jdbc){ //... }
使用这种注入方式的优势:
- 不严格要求属性文件中的属性名与成员变量名一致;
- 元数据支持,帮助IDE生成属性提示。
配置文件还可以使用yaml格式:
application.yml
jdbc:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: westos
更优雅的注入
事实上如果一段属性只有一个Bean需要使用,我们无需将其注入到一个类中。而是直接在需要的地方声明即可:
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
我们直接把@ConfigurationProperties(prefix = "jdbc")
声明在需要使用@Bean的方法上,然后SpringBoot就会自动调用这个Bean的set方法,然后完成注入。使用的前提时:该类必须有对应属性的set方法、