SpringBoot
javaSE:OOP
mysql:持久化
html+css+js+jquery+框架:视图,框架不熟练,css不好
javaweb:独立开发mvc三层架构
ssm:框架,简化了我们的开发流程,配置较为复杂
spring+springMVC+mybatis
spring:主要是ioc与aop技术,大大简化了配置信息的配置难度。
springMVC:主要是方便了前端发送请求到后端接收方面的构建难度
-----------------原本:我们需要让每个servlet继承HttpServlet,并且需要在 web.xml中手动注册每个servlet从 而实现消息的转化
-----------------springMVC:我们需要servlet继承Controller类,在web.xml中只需要注册核心的 dispatchServlet,在bean文件中注册servlet(可以用注解代替),其中包括json乱码、过滤器、拦截器等都可以通过在bean.xml中配置
spring与springMVC的区别:spring主要注重于后端结构的优化、springMVC主要注重于前后端交互模块 上使用spring来简化代码结构
war包:tomcat运行
spring再简化:springboot-jar包:内嵌tomcat,微服务架构!
服务越来越多:springcloud
新服务架构:服务网格!
maven、spring、springmvc、springboot…:约定大于配置
程序 = 数据结构 + 算法
**微服务:**是一种风格,架构风格
MVC三层架构 : MVVM 微服务架构
业务:service:
第一个springBoot程序
- jdk1.8
- maven3.6.1
- springboot:最新版
- idea
官方:提供了一个快速生成的网站!idea集成了这个网站
- 可以在官网下载
- 直接用idea创建一个springboot项目(一般开发直接在idea中创建)
原理初探
pom.xml
- springboot-dependencies:核心依赖在父工程中
- 我们在写或者引入springboot依赖的时候不需要指定版本,就是因为有这些版本仓库
启动器
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
我们要使用什么功能,就只需要找到对应的启动器就好了(例如:spring-boot-starter-web)
主程序
//本身就是一个spring组件
//程序的主入口 SpringBootApplication:标注这个类是一个springboot的应用
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
//将springboot应用启动
SpringApplication.run(HelloWorldApplication.class, args);
}
}
自动配置:@SpringBootApplication
注解详解
@SpringBootConfiguration:springboot的配置
@Configuration:spring配置类
@Component:spring组件
@EnableAutoConfiguration:自动配置
@AutoConfigurationPackage:自动配置包
@Import({Registrar.class}):导入选择器“包注册”
@Import({AutoConfigurationImportSelector.class}):自动配置导入选择
//获取所有的配置
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes)
获取候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
META-INF/spring.factories:自动配置的核心文件
结论:所有的spring自动配置类都在启动类被扫描并加载—spring.factories文件
spring.factories文件包含所有自动配置类()
- springboot在启动的时候从类路径下/META-INF\spring.factories获取指定的值
- 将这些自动配置类导入容器,自动配置生效,帮我们进行自动配置
- 整个javaEE,解决方案和自动配置的都整合在spring-boot-autoconfigure-2.6.0-20211102.142727-409.jar包中
- 他会把所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器
- 容器中有许多xxxxAutoConfiguration的文件,就是这些类给容器中导入这个场景所需的组件,并自动配置(@Configuration)
- 有了自动配置类,免去了我们手动编写配置文件的工作
启动
javaConfig @Configuration @Bean
关于springboot,谈谈你的理解
- 自动装配
- run():判断是否为web项目、推断主类、配置监听器、
全面接管springMVC的配置!实操!
springboot配置
yaml可以直接给实体类赋值
在配置文件中能配置的东西,都存在一个固定的规律
配置文件 spring.xxx= value ==》 xxxxProperties ==》ConfigrationProperties(prefix=“xxx”)
springBoot Web开发
自动装配
- 创建应用,选择模块
springboot帮我们配置了什么?能不能修改、能不能扩展、能改哪些东西
- xxxxAutoConfiguration;向容器中自动配置组件
- xxxxProperties:自动配置类,装配配置文件中自定义的一些内容
要解决的问题;
- 导入静态资源…
- 首页
- jsp,模板引擎Thymelea
- 装配扩展springMVC
- 增删改查
- 拦截器
- 国际化
静态资源
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (this.servletContext != null) {
ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
registration.addResourceLocations(new Resource[]{resource});
}
});
}
}
什么是wenjars
总结:
- 在springboot中我们可以使用一下方式访问静态资源
- webjars ——ip:port/webjars/***
- resource、public、static ——ip:port/***
- 优先级: resource 》 static 》public
在springboot的resource目录下:resource、public、static文件夹都可以放静态资源,
首页如何定制
模板引擎
结论:只要需要使用thymeleaf,只需要导入对应的依赖就可以了,我们将html放到我们的template目录下即可!
<!-- 基于3.x版本开发-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
thymeleaf模板引用步骤:
- 给html引入约束:xmlns:th="http://www.thymeleaf.org"
- 调用数据:th:元素名=“${xxx}”
<div th:text="${msg}"></div> 不转义
<div th:utext="${msg}"></div> 转义
MVC配置原理
在springboot中,有非常多的xxx Configuration 帮助我们进行扩展配置。
项目:springboot+thymeleaf
- 首页配置:注意点,所有页面的静态资源都需要使用thymeleaf——url==@{}
- 页面国际化:需要配置i18n文件、我们如果需要在项目中进行按钮自动切换我们需要自定义一个LocaleResolver组件、记得将自己写的组件配置到spring容器中、#{}
- 登录+拦截
- 员工列表展示
- 提取公共页面
- th:fragment=“sidebar1”
- th:replace="~{common/common::sidebar2(active=‘main’)}"
- 如果要传递参数直接使用()传参
- 提取公共页面
- 添加员工
- 按钮提交
- 跳转到添加页面
- 成功添加
- 返回首页
- CRUD搞定
- 404
前端:推荐使用模板
- 模板:改动即可
- 框架:组件,自己手动拼接
- 栅格系统
- 导航栏
- 侧边栏
- 表单
如何构建一个网站
- 前端搞定:页面长什么样子
- 设计数据库(难点)
- 前端让他能够自动运行,独立化工程
- 数据接口如歌对接,json,对象
- 前后端联调测试
- 重难点:文件上传下载、富文本编辑器识别支持
有一套自己熟悉的后台模板 X-admin
前端界面:至少自己能够通过框架组合出来一个网站页面
-index
-about
-post
-user
让这个网站能够独立运行
回顾
-
springboot是什么
Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。它不仅对Java:JDBC、iBATS/MyBATIs、Hibernate、Java数据对象(JDO)、ApacheOJB和ApacheCayne等所有流行的数据访问框架中提供支持,同时还可以与Spring的事务管理一起使用,为数据访问提供了灵活的抽象。Spring框架最初是没有打算构建一个自己的WebMVC框架,其开发人员在开发过程中认为现有的StrutsWeb框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。
-
微服务
-
helloWorld
-
探究原码-自动装配、
-
springboot的配置YAML
-
多环境切换
-
静态资源映射
-
Thymeleaf :th:**
-
springboot扩展MVC
-
如何修改springboot的默认配置
-
CRUD、国家化
-
拦截器
-
定制首页、错误页
-
JDBC\mybatis
-
Druid
-
Shiro
-
spring Security:
-
异步任务、邮件发送、定时任务
-
swagger
-
dubbo+zookeeper
Data
spring:bean
mybatis
整合包
mybatis-spring-boot-start
- 导入包
- 配置文件
- mybatis配置
- 编写sql
- service层调用dao层
- controller层调用service层
springSecurity:认证和授权
在web开发中,安全第一位!
功能性需求:否
做网站:安全应该在什么时候考虑?——设计之初
-
漏洞,隐私泄露~
-
架构一旦确定,
shiro、SpringSecurity:很像,除了类不一样,名字不一样
认证、授权(vip1,vip2,vip3)
- 功能权限
- 访问权限
- 菜单权限
- …拦截器、过滤器:大量的原生代码
MVC-springmvc-springboot
-------------框架---------------
AOP:横切编程
原理
springSecurity本质就是一个过滤器链
如何加载过滤器? DelegatingFilterProxy过滤器 FilterChainProxy
重要接口:UserDetailsService:查询数据库用户名和密码
PasswordEncoder:密码加密
实操
-
设置用户名和密码
-
通过配置文件
-
通过配置类
-
自定义编写实现类
- 创建配置类,设置使用哪个userDetailsService实现类
- 编写实现类返回User对象,User对象由用户名密码和操作权限
3.2查询数据库完成用户认证(整合mybatisPlus完成)
- 引入依赖
- 建表、实体类
- 整合接口
- 在service中调用mapper查询数据库进行用户认证
-
-
自定义设置登录页面
- 在配置类中实现相关配置
- 创建相关页面
shiro
有哪些功能:
shiro架构(外部)
- subject:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject,Subject代表了当前的用户,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等,与Subject的所有交互都会委托给SecurityManager; Subject其实是一个门面,SecurityManageer才是实际的执行者
- SecurityManager:安全管理器,即所有与安全有关的操作都会与SercurityManager交互,并且它管理着所有的Subject,可以看出它是Shiro的核心,它负责与Shiro的其他组件进行交互,它相当于SpringMVC的DispatcherServlet的角色
- Realm: Shiro从Realm获取安全数据(如用户,角色,权限),就是说SecurityManager要验证用户身份,那么它需要从Realm 获取相应的用户进行比较,来确定用户的身份是否合法;也需要从Realm得到用户相应的角色、权限,进行验证用户的操作是否能够进行,可以把Realm看成DataSource;
shiro架构(内部)
swagger
配置swagger信息
-
添加注解
@Configuration @EnableSwagger2 //开启swagger @ConditionalOnExpression()
-
创建docket实例
//配置swagger的docker的bean实例 @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()); }
-
配置swagger基本信息
//配置swagger信息 private ApiInfo apiInfo(){ Contact DEFAULT_CONTACT = new Contact("陈宇星", "http://localhost:8080/hello", "1982863768@qq.com"); return new ApiInfo("陈宇星的swaggerAPI文档", "加油!!!", "1.0", "http://localhost:8080/hello", DEFAULT_CONTACT, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList()); }
-
启动项目,访问swagger-ui.html
Swagger配置扫描接口
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.chen.controller"))
.paths()
.build();
}
问题:测试环境启动swagger,正式环境不启动swagger
答:获取配置文件中配置的环境
配置API文档的分组
.groupName("陈宇星")
问:配置多个分组
答:创建多个docket对象
实体类配置
需要在controller层中引用过该实体类才能在swagger文档中显示
总结:我们可以通过swagger给一些比较难理解的属性或者接口,增加注释信息
接口文档实施更新
可以在线测试
任务
异步任务多线程@EnableAsync:开启异步注解功能
定时任务~@EnableScheduling:开启定时注解功能
TaskScheduler 任务调度者
TaskExecutor 任务执行者
@EnableScheduling//开启定时功能的注解
@Scheduled() //什么时候执行
Cron表达式
邮件发送~:
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2:注入JavaMailSenderImpl类
@Autowired
JavaMailSenderImpl javaMailSender;
3:创建email并发送
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setSubject("陈宇星,你好!");
simpleMailMessage.setText("谢谢你的课程!");
simpleMailMessage.setTo("1982863768@qq.com");
simpleMailMessage.setFrom("1982863768@qq.com");
javaMailSender.send(simpleMailMessage);
redis
springboot操作数据:spring-data、jpa、jdbc、MongoDB、redis
SpringData:是和springboot齐名的项目
说明:在springboot2.x之后,原来使用的jedis被替换成了lettuce
jedis:采用的是直连,多个线程操作的话是不安全的。
想要避免不安全,使用jedis pool连接池!
lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况!可以减少线程数据
源码分析
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"} //我们可以自己定义一个redisTemplate来替换这个默认的
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//默认的RedisTemplate没有过多地设置,redis对象都需要序列化
//两个泛型都是object,object的类型我们后面使用需要强制转换<String, Object>
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean //由于String是redis中最常用的类型,所以单独提出来一个bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
整合测试
-
导入依赖
<!-- 操作redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
配置连接
#配置redis spring.redis.host=127.0.0.1 spring.redis.port=6379
-
测试
分布式Dubbo + Zookeeper + springboot
什么是分布式系统
分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。
分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
Dubbo:用于微服务之间的联系
zookeeper:注册中心——用于治理所有微服务
dubbo-admin:是一个监控管理后台~~查看我们注册了哪些服务,哪些服务被消费了
Dubbo:jar包~
RPC
两个核心模块:通讯、序列化。
序列化:数据传输需要转换
Netty:30天~
分布式开发步骤
前提:zookeeper注册中心已经开启
-
提供者提供服务
-
导入依赖
<!-- 导入dubbo、zookeeper依赖--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 引入zookeeper--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.14</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
-
配置注册中心的地址,以及服务发现名,和要扫描的包~
#服务应用的名字 dubbo.application.name=provider-server #注册中心的地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 #哪些服务要被注册 dubbo.scan.base-packages=com.chen.service
-
在想要被注册的服务上面增加 import org.apache.dubbo.config.annotation.Service;包下的@Service注解
-
启动项目
-
-
消费者如何消费
-
导入依赖
同上
-
配置注册中心的地址,配置自己的服务名
#服务应用的名字 dubbo.application.name=consumer-server #注册中心的地址 dubbo.registry.address=zookeeper://127.0.0.1:2181
-
从远程注入服务
-
首先创建远程服务对应的接口类,注意:需要在相同的包目录下
-
在需要调用的地方引入该类,使用@Reference
-
-
聊聊现在跟未来
回顾以前:
架构
三层架构 MVC
架构就是为了 解耦
开发框架
spring
IOC AOP
IOC:控制反转:原来我们都是自己一步步操作,现在交给容器!我们需要什么自己直接去拿
约泡:
泡温泉,泡茶。。。,炮友
附近的人,打招呼、加微信、聊天....---》约炮
浴场:温泉、茶室、炮友
直接进温泉,就有人和你一起了!
AOP:切面(本质,动态代理)
为了解决什么问题:在不影响原来业务的情况下,实现动态的增加功能,例:日志,事务 等
Spring是一个轻量级的JAVA开源框架,容器
目的:解决企业级开发的复杂性
Spring是春天,缺点:配置文件复杂!
springboot
springboot并不是新东西,就是spring的升级版!
新一代javaEE的开发标准,开箱即用!--》拿过来就可以用
他自动帮我们配置了非常多的东西
特性:约定大于配置!!!
随着公司体系越来越大,用户越来越多!
微服务架构---》新架构
模块化、功能化!
用户模块、支付模块、签到模块....
如果基数过大:一台服务器解决不了,增加服务器!
假设A服务器占用98%资源,B服务器只占用了10%的资源。---负载均衡;
将原来的整体项目分成模块化了,用户、签到看成单独的项目
项目之间的交互
用户非常多,但是签到非常少!---给用户多一点服务器,给签到少一点服务器!
微服务架构问题:
四个核心问题: NetFlix一站式解决方案(2018年年底,停止维护)
1:这么多服务,客户端如何去访问---------------API网关
2:这么多服务,服务之间如何进行通信------------Feign(基于http通信方式,同步并阻塞)
3:这么多服务,如何治理----------------------服务注册于发现,Eureka
4:服务挂了,怎么办?------------------------熔断机制,Hystix
解决方案:
springcloud:是一套生态,是用来解决以上分布式架构的4个问题
想要使用springcloud,必须掌握springboot,因为springcloud基于springboot
Apache dubbo zookeeper
API:没有
dubbo:是一个高性能的基于java实现的,RPC框架
服务注册与发现:zookeeper:
熔断机制:没有
springcloud alibaba---一站式解决方案
服务网格:下一代微服务标准,server Mesh——————代表解决方案:istio
1API网关,服务路由
2:http rpc框架 异步调用
3:服务注册与发现,高可用
4:熔断机制,服务降级
特性:约定大于配置!!!
随着公司体系越来越大,用户越来越多!
微服务架构—》新架构
模块化、功能化!
用户模块、支付模块、签到模块…
如果基数过大:一台服务器解决不了,增加服务器!
假设A服务器占用98%资源,B服务器只占用了10%的资源。—负载均衡;
将原来的整体项目分成模块化了,用户、签到看成单独的项目
项目之间的交互
用户非常多,但是签到非常少!—给用户多一点服务器,给签到少一点服务器!
微服务架构问题:
四个核心问题: NetFlix一站式解决方案(2018年年底,停止维护)
1:这么多服务,客户端如何去访问---------------API网关
2:这么多服务,服务之间如何进行通信------------Feign(基于http通信方式,同步并阻塞)
3:这么多服务,如何治理----------------------服务注册于发现,Eureka
4:服务挂了,怎么办?------------------------熔断机制,Hystix
解决方案:
springcloud:是一套生态,是用来解决以上分布式架构的4个问题
想要使用springcloud,必须掌握springboot,因为springcloud基于springboot
Apache dubbo zookeeper
API:没有
dubbo:是一个高性能的基于java实现的,RPC框架
服务注册与发现:zookeeper:
熔断机制:没有
springcloud alibaba—一站式解决方案
服务网格:下一代微服务标准,server Mesh——————代表解决方案:istio
1API网关,服务路由
2:http rpc框架 异步调用
3:服务注册与发现,高可用
4:熔断机制,服务降级