springBoot
java的开发方式
- 农耕时代java开发:
- 工业时代java开发
- 现代化java开发:
- 各种微服务齐活:服务注册与发现、负载均衡与熔断、网关等
- 各种组件一起上:springboot、springcloud...
优先配置:阿里云中央仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
简介:
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
Spring Boot 简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。
优点:
- 简单配置
- 简化开发过程
- 很容易集成第三方依赖[推荐]
方式一
springmvc实现
实现步骤:
- 创建maven工程
- 导入相关依赖的jar包(例如:spring-web、spring-webmvc等)
- 编写springmvc核心配置文件
- 编写web.xml文件
- 编写XxxController
创建maven工程,导入坐标
<!--父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
</parent>
<!--依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
编写业务代码
estController
public class HelloController {
/**
*
* @return
*/
@RequestMapping("/hello")
public String sayHello(){
return "hello, Spring Boot";
}
}
- 编写引导程序
该程序是发布springboot应用的入口(只需要run一下)
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
- 测试
在DemoApplication里运行主方法
方式二
创建spring initializr工程
通过idea工具创建工程时,不再选择maven了而是选择spring initializr。然后去勾选相关依赖。
- 编写controller
@RestController
public class HelloController {
/***
* 请求 /hello 输出hello springboot!
* @return
*/
@RequestMapping(value = "/hello")
public String hello(){
return "hello springboot! demo2!";
}
}
测试:
(1)语法
- 格式:key=value
- 如果是修改SpringBoot中的默认配置,那么key则不能任意编写,必须参考SpringBoot官方文档。
- application.properties官方文档:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
(2)案例
在resources目录下新建application.properties
#tomcat port
server.port=18081
#app context
server.servlet.context-path=/demo
application.yml(application.yaml)
(1)语法
普通数据:
说明:
key: value(注意:冒号有一个空格)
示例:
name: tom
key: value
#对象 user: 回车 两个空格name1: tom
对象数据或map
#说明:
key:
key1: value1
key2: value2
#示例:
user:
name: tom
age: 23
addr: beijing
集合数据1:存储简单类型
说明:
key:
value1
value2
或:
key: value1,value2
示例:
city:
beijing
anhui
jiangxi
shenzhen
或:
city: [beijing,anhui,jiangxi,shenzhen]
集合数据2:存储对象类型
说明:
key:
key1: vlaue1
key2: value2
示例:
student:
- name: zhangsan
age: 23
addr: BJ
- name: lisi
age: 25
addr: SZ
(2)案例
将springboot-demo1中的application.properties换成application.yml,代码如下
server:
port: 18081
servlet:
context-path: /demo
配置文件与配置类的属性映射方式(了解)
(1)使用注解@Value映射
@value注解将配置文件的值映射到Spring管理的Bean属性值
(2)使用注解@ConfigurationProperties映射
通过注解@ConfigurationProperties(prefix=''配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射。
使用@ConfigurationProperties方式必须提供Setter方法,使用@Value注解不需要Setter方法。
注意使用该注解需要引入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
热部署
(1)配置pom
针对每次修改代码都需要重新发布程序,在springboot中提供了热部署插件。只需要在pom文件中添加热部署依赖即可,如下所示
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
同时需要给工程添加一个插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
</plugin>
</plugins>
</build>
(2)开启自动构建工程
1、在idea的settings中勾选自动构建工程选项即可。如图所示:
2、Shift + Ctrl + Alt + /:选择registry,弹出框选择 compiler.automake.allow.when.app.running 勾选上即可
测试访问<http://localhost:18081/demo/hello> 后台更改数据,无需重启服务,直接刷新页面就可以看到最新数据。
@Mapper注册到userDao接口中
springboot起步依赖
springboot自动配置
配置文件
热部署
五.springboot集成其他框架(重点)
集成spring Data redis
Spring Data: Spring 的一个子项目。用于简化数据库访问,支持NoSQL和关系数据库存储。其主要目标是使数据库的访问变得方便快捷。
添加Redis启动器
创建工程了添加Redis启动器。
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置application
在application.properties文件中配置连接Redis的信息:
#redis,端口可以不填,默认就是6379
spring.redis.host=192.168.200.128
spring.redis.port=6379
更新程序
更新UserServiceImpl类中的findAll方法。在该类中注入RedisTemplate对象。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
@Override
public List<User> findAll() {
// 首先判断缓存中是否有数据
List<User> users = (List<User>) redisTemplate.boundValueOps("heima:springboot:user:id:1").get();
if(users == null){
// 从数据库中查询
users = userMapper.findAll();
// 放入缓存
redisTemplate.boundValueOps("heima:springboot:user:id:1").set(users);
}
return users;
}
}
集成springData JPA无需配置
需求
完成对user表的CRUD操作
创建工程
创建工程,并且勾选相关依赖(Spring Data JPA)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
/**
* @Entity:表明为一个实体对象
* @Table:指定映射的表
* @Id:指定为主键
* @GeneratedValue:指定注解的生成策略
* TABLE:使用一个特定的数据库表格来保存主键。
* SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
* IDENTITY:主键由数据库自动生成(主要是自动增长型)
* AUTO:主键由程序控制
* @Column:指定表的列名
*/
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)//主键生成策略
@Column(name = "id")//指定列名
private Integer id;
private String username;
private String password;
private String address;
编写dao接口
在工程src目录下创建dao接口,需要继承JpaRepository对象(该对象完成对数据库的CRUD过程,并且支持分页查询、排序等功能)。
public interface UserDao extends JpaRepository<User, Integer> {
}
编写service接口以及实现类
1、编写service接口:
/**
* 服务接口
*/
public interface UserService {
List<User> findAll();
User findUserById(Integer id);
void add(User user);
void update(User user);
void deleteUserById(Integer id);
Integer getAllCount();
}
实现类
/**
* 服务实现类
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
/**
* 查询所有用户
* @return
*/
@Override
public List<User> findAll() {
return userDao.findAll();
}
/**
* 根据id 查询用户
* @param id
* @return
*/
@Override
public User findUserById(Integer id) {
Optional<User> optionalUser = userDao.findById(id);
return optionalUser.get();
}
/**
* 添加
* @param user
*/
@Override
public void add(User user) {
userDao.save(user);
}
/**
* 更新
* @param user
*/
@Override
public void update(User user) {
userDao.save(user);
}
/**
* 删除
* @param id
*/
@Override
public void deleteUserById(Integer id) {
userDao.deleteById(id);
}
/**
* 查询数量
* @return
*/
@Override
public Integer getAllCount() {
return Integer.valueOf(userDao.count() + "");
}
}
1.创建工程勾选依赖
2.编写pojo,添加注解
3.编写Dao(需要继承JpaRepository<T,ID>)
4.编写Service
5.编写Controller
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 查询所有用户
* @return
*/
@RequestMapping("findAll")
public List<User> findAll(){
return userService.findAll();
}
/**
* 根据id查询
* @param id
* @return
*/
@RequestMapping("/findUserById/{id}")
public User findUserById(@PathVariable Integer id){
return userService.findUserById(id);
}
/**
* 保存
* @param user
*/
@RequestMapping("/saveUser")
public void saveUser(User user){
userService.add(user);
}
/**
* 更新
* @param user
*/
@RequestMapping("/update")
public void updateUser(User user){
userService.update(user);
}
/**
* 删除
* @param id
*/
@RequestMapping("/deleteUserById/{id}")
public void deleteUserById(@PathVariable Integer id){
userService.deleteUserById(id);
}
}
配置application.properties
#hibernate.ddl-auto,建表策略:
#update:每次运行程序,没有表会新建表,表内有数据不会清空,只会更新
#create:每次运行程序,没有表会新建表,表内有数据会清空
#create-drop:每次程序结束的时候会清空表
#validate:运行程序会校验数据与数据库的字段类型是否相同,不同会报错
在application.yml中配置相关JPA内容。
6.测试
pojo 实体类添加注解
@Entity:表明当前类是要跟数据库关联的实体类
@Table("xxx")数据库表名
@Id:指定主键
PS:注解说明
- @Entity:表明为一个实体对象
- @Table:指定映射的表
- @Id:指定为主键
- @GeneratedValue:指定注解的生成策略
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制
- @Column:指定表的列明
集成定时器
步骤:
- 开启注解支持
@EnableScheduling
- 编写定时任务
在类上加@Component
@Scheduled
测试
备注:可以通过资料中提供的cron表达式工具去生成
CronTrigger配置完整格式为: [秒][分] [小时][日] [月][周] [年]
序号 | 说明 | 是否必填 | 允许填写的值 | 允许的通配符 |
1 | 秒 | 是 | 0-59 | , - * / |
2 | 分 | 是 | 0-59 | , - * / |
3 | 小时 | 是 | 0-23 | , - * / |
4 | 日 | 是 | 1-31 | , - * ? / L W |
5 | 月 | 是 | 1-12或JAN-DEC | , - * / |
6 | 周 | 是 | 1-7或SUN-SAT | , - * ? / L W |
7 | 年 | 否 | empty 或1970-2099 | , - * / |
六.springboot打包方式
步骤
- 修改pom.xml(设置包类型<jar、war>)
- 修改pom.xml(设置跳过测试代码)
- 打包
- 测试
实现
- 在pom文件中指定包类型(可以不指定,默认就是jar)
跳过测试代码(不设置时会执行所有的测试代码)
<properties>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
</properties>
打包
方式一:直接在idea中执行如下操作
方式二:通过命令执行
1、通过cmd进入到工程的目录中,与pom.xml同级
2、然后执行命令:mvn clean package [-Dmaven.test.skip=true] --->[]内为可选操作,排除测试代码,也就是说打包时跳过测试代码
如下命令打包:mvn clean package -Dmaven.test.skip=true
测试:
java -jar springboot_demo4_jpa-0.0.1-SNAPSHOT.jar
-Xmx:最大堆内存
-Xms:初始堆内存
java -Xmx80m -Xms20m -jar springboot_demo4_jpa-0.0.1-SNAPSHOT.jar