Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序,您可以“直接运行”这些应用程序。
简化了项目配置,甚至可以没有配置,xml 文件没有了
简化开发
两种 一种是联网 一种是maven项目自己写
快速开发 必须连接网络
idea中 注意版本选2.4.9 选择 启动器
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
插件保证打包时候 将 依赖打成 jar 包 Boot-INFO 的 lib 下
通过 properties、yml/yaml 文件 设置 需要修改的参数
启动器 借助了 maven 的依赖传递
敏捷开发的依据
配置文件作用规范
properties 预定义、自定义的键值对
ymal/yml
yml 文件书写格式
name: zhangfei
age: 30
#person.pname=zhangfei
#person.page=30
#person.idcard.cname=123
person:
pname: "zhang \n fei"
page: 30
idcard:
cname: 123
ids:
- 10
- 20
- 30
注入实体类属性
@Component
@ConfigurationProperties(prefix = "person")
建立多个 yml 文件 不同文件不同配置
一个 application.yml 主文件 配置如下
#springboot 预定义配置 -- 配置的作用就是设置当前项目处于哪个环境,就需要使用哪个配置文件
#spring.profiles.active 写名字即可
spring:
profiles:
active: test
配置文件的位置
项目类路径下/类路径config 文件夹下 (package 打包之后的路径 Boot-INFO 的 classes 是类路径)(磁盘路径 项目config开发可以用 不常用)
静态资源 建目录 a/b
四个默认目录
自定义目录
# 自定义静态资源保存位置
spring:
resources:
static-locations: classpath:/static/,classpath:/resources/,classpath:/public/,classpath:META-INF/resources/,file:C:\Users\Administrator\Desktop\pic\
maven 图片打成 jar 包 放到本地仓库 jar包依赖配置
建立目录 src/main/resources/META-INF/resources/webjars 放图片
install 安装到本地仓库.
需要使用的地方导入 maven 依赖即可
主启动类 格式固定
@SpringBootApplication
public class SpringBootThirdApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootThirdApplication.class,args);
}
}
静态资源的访问:
第一种
localhost:8080/图片名称
第二种
localhost:8080/webjars/图片名称
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("放行或者拦截的方法。。。。。。");
return true;
}
}
// 自定义配置类 声明此类配置类
@Configuration
public class CustomConfig implements WebMvcConfigurer {
// 拦截器注册 -- 把自顶有拦截器实现注册
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
在当前项目中,由客户端只要是发出/main请求,就返回main.html视图页面
多个服务请求同一个页面 所以定义一个全局的视图 进行重定向
//配置视图控制器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/main").setViewName("/main.html");
}
@RequestMapping("sec")
public String sec() {
return "redirect:/main";
}
@RequestMapping("third")
public String third() {
return "redirect:/main";
}
需求:数据传递 与 页面模板
页面模板 不同的商品详情、不同的新闻详情 都是类似的模板。
模板引擎/网页静态化技术 Thymeleaf、Freemarker
template文件夹是受保护的,不能直接访问,为了前端页面先渲染时有数据,必然要用同步方案。
模板引擎工作原理图
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>入门案例</title>
</head>
<body>
<p>模板引擎入门案例</p>
<p th:text="${name}"></p>
</body>
</html>
# 禁用 thymeleaf缓存的设置
spring:
thymeleaf:
cache: false
实体类对象的解析
<p>实体类对象如何解析</p>
<p>
<span th:text="${user.uid}"></span>-
<span th:text="${user.uname}"></span>-
<span th:text="${user.upwd}"></span>
</p>
集合对象的解析
<!-- c:foreach items="" var="" varStatus=""下标-->
<p>集合对象如何解析:集合的遍历</p>
<p th:each="user,iterStat : ${list}">
<!-- INDEX 绝对的下标 从 0-->
<span th:text="${iterStat.index}"></span>-
<!-- count 从 1 开始计数-->
<span th:text="${iterStat.count}"></span>-
<span th:text="${user.uid}"></span>-
<span th:text="${user.uname}"></span>-
<span th:text="${user.upwd}"></span>
</p>
如何处理图片
<p>如何处理图片</p>
<img th:src="${imageUrl}">
<p>如何处理超链接</p>
<a th:href="${url}">百度</a>
如何处理字符串
<p>如何处理字符串片段</p>
<p th:text="'字符串片段' + ${str}"></p>
<p th:text="|字符串片段${str}|"></p>
<!-- 格式错误 只能以上两种-->
<!--<p th:text="字符串片段${str}"></p>-->
网页内容分割片段
头部 header 定义 相当于 id
<p>头部页面片段</p>
<h3 th:fragment="headerH3">头部共用部分</h3>
三种引入方式
<!-- 页面片段引入-->
<!-- 三种 引入方式-->
<!-- inser 插入 整个内容往里添加 div>h3>文字-->
<div th:insert="~{header ::headerH3}"></div>
<!-- replace 替换 没有div了 h3>文字-->
<div th:replace="~{header ::headerH3}"></div>
<!-- include 包含 没有了h3 只有文字 div>文字-->
<div th:include="~{header ::headerH3}"></div>
模板判断选择
<p>选择结构</p>
<!-- 条件成立-->
<span th:if="${sex == 1}">男</span>
<!-- 条件不成立-->
<span th:unless="${sex == 1}">男</span>
<!-- 多向判断-->
<p th:switch="${score}">
<span th:case="60">及格</span>
<span th:case="70">中等</span>
<span th:case="80">良好</span>
<span th:case="90">优秀</span>
</p>
内置函数
<p>内置函数</p>
<p th:text="${date}"></p>
<p th:text="${#dates.format(date,'yyyy-MM-dd')}"></p>
<p th:text="${#dates.year(date)}"></p>
<hr>
<p>数字操作</p>
<p th:text="${num}"></p>
<p th:text="${dou}"></p>
<!-- 格式化 小数点前凑够5位,后保留两位 进位-->
<p th:text="${#numbers.formatDecimal(dou,5,2)}"></p>
<!-- 生成序列 1到10-->
<p th:text="${#numbers.sequence(1,10)}"></p>
<p th:each="seq : ${#numbers.sequence(1,10)}">
<span th:text="${seq}"></span><br>
</p>
<hr>
<p>字符串操作</p>
<p th:text="${str}"></p>
<!-- 省略多余的字符-->
<p th:text="${#strings.abbreviate(str,30)}"></p>
渲染 css、js 路径
同时配置 href/src 与 th:href/src 路径正确 并且提示正常
<link rel="stylesheet" type="text/css" href="main.css" th:href="@{/main.css}">
<script type="text/javascript" src="jquery.js" th:src="@{/jquery.js}"></script>
还是去主启动器启动 加入测试启动器、注解换SpringBootTest
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
@SpringBootTest
class Springboot03Thymeleaf2ApplicationTests {
@Autowired
private User user;
@Test
void contextLoads() {
System.out.println(user);
}
}
mybatis 整合启动器
mysql 驱动
<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>
<scope>runtime</scope>
</dependency>
配置文件
#数据源配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///mybatis?characterEncoding=utf8
username: root
password: admin
#配置mybatis规则
mybatis:
mapper-locations: classpath:mappers/*.xml # sql映射文件位置
type-aliases-package: com.bh.pojo # 配置了实体的别名
configuration:
map-underscore-to-camel-case: true # 开启驼峰命名法 不写全局 配置文件在 configuretion 对象中
#该配置项就是指将带有下划线的表字段映射为驼峰格式的实体类属性。
生成代理对象
局部配置 Mapper注解 获取持久层代理对象
// 局部配置 -- 获取持久层代理对象
@Mapper
public interface UserDao {
List<User> selectAll();
}
全局配置 主启动器上 MapperScan(basePackages = "com.bh.dao")
@SpringBootApplication
// 全局配置 -- 获取持久层代理对象
@MapperScan(basePackages = "com.bh.dao")
public class Springboot04MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot04MybatisApplication.class, args);
}
}
开启Redis
# 进入bin目录
cd /usr/app/software/redis/bin
# 后台启动 redis
./redis-server redis-conf
# 查看 redis 进程
ps -aux | grep redis
# 进入 redis 客户端 -a 密码 123
./redis-cli -a 123
# 清空所有库中的所有数据
flushall
加入 启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件 application.yml 端口默认6379
spring:
redis:
host: 192.168.159.128
password: 123
注入操作Redis的模板
RedisTemplate、StringRedisTemplate两种模板
// 注入 redis 模板对象 保存键值对数据 区别
// RedisTemplate 模板会自动给 key、value 加入序列化数据,显示十六进制编码
// StringRedisTemplate模板不会自动给 key、value 加入序列化数据,中文显示
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
主启动类排除数据源 自动添加
exclude ={DataSourceAutoConfiguration.class}
RedisTemplate 模板会自动给 key、value 加入序列化数据,显示十六进制编码
StringRedisTemplate模板不会自动给 key、value 加入序列化数据,中文显示
不能混着用 用哪个操作哪个对象
方法如下:
redisTemplate.boundValueOps().set/get
// 测试 -- 向库中添加数据 -- string类型
// set
@Test
public void testSaveString() {
redisTemplate.boundValueOps("name1").set("张飞");
// 设置有效时间 TimeUnit 泛型的值为单位
redisTemplate.expire("name1",1, TimeUnit.MINUTES);
}
// get
@Test
public void testGetString() {
String name1 = (String) redisTemplate.boundValueOps("name1").get();
System.out.println(name1);
}
// set
@Test
public void testSaveString2() {
stringRedisTemplate.boundValueOps("name2").set("李炳汉");
}
// get
@Test
public void testGetString2() {
String name1 = (String) stringRedisTemplate.boundValueOps("name2").get();
System.out.println(name1);
}
// 删除数据
// del
@Test
public void testDelString() {
redisTemplate.delete("name1");
}
// 列表类型的操作
// lpush
@Test
public void testSaveList() {
redisTemplate.boundListOps("list1").leftPushAll("aaa","bbb","ccc","ddd","aaa");
}
// lrange
@Test
public void testGetList() {
List list1 = redisTemplate.boundListOps("list1").range(1, -1);
System.out.println(list1);
}
// lindex
@Test
public void testIndex() {
String list1 = (String) redisTemplate.boundListOps("list1").index(1);
System.out.println(list1);
}
// lrem
@Test
public void remove() {
redisTemplate.boundListOps("list1").remove(1,"aaa");
}
// set 集合操作 无序
// sadd
@Test
public void testSaveSet() {
redisTemplate.boundSetOps("set1").add("aaa","bbb","ccc","ddd");
}
// smembers
@Test
public void testGetSet() {
Set set1 = redisTemplate.boundSetOps("set1").members();
System.out.println(set1);
}
// srem
@Test
public void testDeleteSet() {
redisTemplate.boundSetOps("set1").remove("aaa");
}
// 散列结构操作
// hmset
@Test
public void testSaveHash() {
Map<String,Object> map = new HashMap<>();
map.put("name","张飞");
map.put("age",30);
map.put("bir",new Date());
redisTemplate.boundHashOps("hash1").putAll(map);
}
// hkeys、hget 结合使用
@Test
public void testGetHash() {
Set<String> keys = redisTemplate.boundHashOps("hash1").keys();
for (String key : keys) {
Object value = redisTemplate.boundHashOps("hash1").get(key);
System.out.println(key+"--"+value);
}
}
// hdel
@Test
public void testDeleteHash() {
redisTemplate.boundHashOps("hash1").delete("name");
}
启动 Zookeeper
./zkServer.sh start
ps -aux | grep zookeeper
打开 dubbo-admin
先准备提供者、在准备消费者
1)导入 jar、web 项目
<!-- zookeeper 客户端-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
<!-- 整合 dubbo 启动器-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
2)对外提供功能、远程调用功能
需要两个注解 因为 使用了 SpringBoot 大容器套小容器
Component(Ioc 容器管理对象) 和
Service(Dubbo 容器管理对象) 注解都加上
远程调用功能需要先造接口一模一样
3)yml配置文件
名称、端口、注册中心地址、注册哪些服务
spring:
dubbo:
application:
name: provider
registry:
address: zookeeper://192.168.159.128:2181
scan: con.bh.service
protocol:
name: dubbo
#tomcat端口
server:
port: 8000
主启动器 开启 EnableDubboConfiguration
thymeleaf 也需要启动器!!!
4)结果