栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot

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.8maven3.6.1springboot:最新版idea

官方:提供了一个快速生成的网站!idea集成了这个网站

可以在官网下载直接用idea创建一个springboot项目(一般开发直接在idea中创建) 原理初探

pom.xml

springboot-dependencies:核心依赖在父工程中我们在写或者引入springboot依赖的时候不需要指定版本,就是因为有这些版本仓库 启动器


   org.springframework.boot
   spring-boot-starter

我们要使用什么功能,就只需要找到对应的启动器就好了(例如: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 configurations = this.getCandidateConfigurations(annotationmetadata, attributes)
获取候选的配置
protected List getCandidateConfigurations(Annotationmetadata metadata, AnnotationAttributes attributes) {
        List 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-INFspring.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目录下即可!

        
            org.thymeleaf
            thymeleaf-spring5
        
        
            org.thymeleaf.extras
            thymeleaf-extras-java8time
        

thymeleaf模板引用步骤:

    给html引入约束:xmlns:th="http://www.thymeleaf.org"调用数据:th:元素名=“${xxx}”
  不转义
	转义
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、国家化

    拦截器

    定制首页、错误页

    JDBCmybatis

    Druid

    Shiro

    spring Security:

    异步任务、邮件发送、定时任务

    swagger

    dubbo+zookeeper

Data

spring:bean

mybatis

整合包

mybatis-spring-boot-start

    导入包配置文件mybatis配置编写sqlservice层调用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表达式

邮件发送~:

    引入依赖

    org.springframework.boot
    spring-boot-starter-mail

​ 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 redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//默认的RedisTemplate没有过多地设置,redis对象都需要序列化
//两个泛型都是object,object的类型我们后面使用需要强制转换
    RedisTemplate 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;
}

​ 整合测试

    导入依赖

            
                org.springframework.boot
                spring-boot-starter-data-redis
            
    

    配置连接

    #配置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注册中心已经开启

    提供者提供服务

      导入依赖

              
                  org.apache.dubbo
                  dubbo-spring-boot-starter
                  2.7.3
              
              
                  com.github.sgroschupf
                  zkclient
                  0.1
              
      
      
              
                  org.apache.curator
                  curator-framework
                  2.12.0
              
              
                  org.apache.curator
                  curator-recipes
                  2.12.0
              
              
                  org.apache.zookeeper
                  zookeeper
                  3.4.14
                  
                      
                          org.slf4j
                          slf4j-log4j12
                      
                  
              
      

      配置注册中心的地址,以及服务发现名,和要扫描的包~

      #服务应用的名字
      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:熔断机制,服务降级

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/760256.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号