SpringBoot项sir

html+css+jquery+框架:视图,框架不熟练,css不好

javaWeb:独立开发MVC三层架构的网站:原始

SSM:框架:简化了我们的开发流程,配置也开始较为复杂

war:tomcat运行

spring再简化:SpringBoot-jar;内嵌tomcat;微服务架构!

服务越来越多:springcloud

Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。

为了降低Java开发的复杂性,Spring采用了以下4种关键策略:

1、基于POJO的轻量级和最小侵入性编程,所有东西都是bean;

2、通过IOC,依赖注入(DI)和面向接口实现松耦合;

4、通过切面和模版减少样式代码,RedisTemplate,xxxTemplate;

所谓单体应用架构(allinone)是指,我们将一个应用中的所有应用服务都封装在一个应用中。

无论ERP,CRM或是其他什么系统,你都把数据库访问,web访问,等等各个都放到一个war中

allinone的架构方式,我们把所有的功能单元放在一个应用里面。然后我们把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后在负载均衡。

这样做的好处是

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

使用spring-boot-devtools,可以实现指定目录(默认为classpath路径)下的文件进行更改后,项目自动重启,更改后的代码自动生效。

Banner.txt修改启动图

自动配置

pom.xml

启动器

//程序的主入口//@SpringBootApplication:标注这个类是一个springboot的应用@SpringBootApplicationpublicclassSpringbootApplication{//将springboot应用启动publicstaticvoidmain(String[]args){SpringApplication.run(SpringbootApplication.class,args);}} 注解

@SpringBootConfiguration:springboot的配置 @Configuration:spring配置类 @Component:说明这也是个spring组件@EnableAutoConfiguration:自动配置AutoConfigurationPackage:自动配置包 @Import(AutoConfigurationPackages.Registrar.class):自动配`包注册`@Import(AutoConfigurationImportSelector.class):自动导入选择器//获取所有的配置Listconfigurations=getCandidateConfigurations(annotationMetadata,attributes);获取候选的配置

protectedListgetCandidateConfigurations(AnnotationMetadatametadata,AnnotationAttributesattributes){Listconfigurations=newArrayList<>(SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader()));ImportCandidates.load(AutoConfiguration.class,getBeanClassLoader()).forEach(configurations::add);Assert.notEmpty(configurations,"NoautoconfigurationclassesfoundinMETA-INF/spring.factoriesnorinMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.Ifyou"+"areusingacustompackaging,makesurethatfileiscorrect.");returnconfigurations;}META-INF/spring.factorie自动配置的核心文件org.springframework.boot.autoconfigure.AutoConfiguration.imports

Propertiesproperties=PropertiesLoaderUtils.loadProperties(resource);所有资源加载到配置类中结论:springboot所有自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应启动器了,有了启动器,我们自动装配就会生效,然后配置成功了

SpringApplication.run分析

分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;

这个类主要做了以下四件事情:

1、推断应用的类型是普通的项目还是Web项目

2、查找并加载所有可用初始化器,设置到initializers属性中

3、找出所有的应用程序监听器,设置到listeners属性中

4、推断并设置main方法的定义类,找到运行的主类

SpringBoot使用一个全局的配置文件,配置文件名称是固定的

application.properties

application.yml

配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;

比如我们可以在配置文件中修改Tomcat默认启动的端口号!测试一下!

server.port=8081yaml概述YAML是"YAMLAin'taMarkupLanguage"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:"YetAnotherMarkupLanguage"(仍是一种标记语言)

这种语言以数据作为中心,而不是以标记语言为重点!

以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml

传统xml配置:

8081yaml配置:

server: prot:8080yaml基础语法说明:语法要求严格!

1、空格不能省略

2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。

3、属性和值的大小写都是十分敏感的。

字面量:普通的值[数字,布尔值,字符串]

字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;

k:v注意:

“”双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思;

比如:name:"kuang\nshen"输出:kuang换行shen

''单引号,会转义特殊字符,特殊字符最终会变成和普通字符一样输出

比如:name:‘kuang\nshen’输出:kuang\nshen

对象、Map(键值对)

#对象、Map格式k: v1: v2:在下一行来写对象的属性和值得关系,注意缩进;比如:

student: name:qinjiang age:3行内写法

student:{name:qinjiang,age:3}数组(List、set)

用-值表示数组中的一个元素,比如:

pets: -cat -dog -pig行内写法

pets:[cat,dog,pig]修改SpringBoot的默认端口号

配置文件中添加,端口号的参数,就可以切换端口;

server: port:808yaml可以给实体类赋值1、在springboot项目中的resources目录下新建一个文件application.yml

2、编写一个实体类Dog;

packagecom.kuang.springboot.pojo;@Component//注册bean到容器中publicclassDog{ privateStringname; privateIntegerage;//有参无参构造、get、set方法、toString()方法}3、思考,我们原来是如何给bean注入属性值的!@Value,给狗狗类测试一下:

@Component//注册beanpublicclassDog{ @Value("阿黄") privateStringname; @Value("18") privateIntegerage;}4、在SpringBoot的测试类下注入狗狗输出一下;

@SpringBootTestclassDemoApplicationTests{@Autowired//将狗狗自动注入进来Dogdog;@TestpublicvoidcontextLoads(){ System.out.println(dog);//打印看下狗狗对象}}结果成功输出,@Value注入成功,这是我们原来的办法对吧。

5、我们在编写一个复杂一点的实体类:Person类

@Component//注册bean到容器中publicclassPerson{ privateStringname; privateIntegerage; privateBooleanhappy; privateDatebirth; privateMapmaps; privateListlists; privateDogdog;//有参无参构造、get、set方法、toString()方法}6、我们来使用yaml配置的方式进行注入,大家写的时候注意区别和优势,我们编写一个yaml配置!

person:name:qinjiangage:3happy:falsebirth:2000/01/01maps:{k1:v1,k2:v2}lists:-code-girl-musicdog:name:旺财age:17、我们刚才已经把person这个对象的所有值都写好了,我们现在来注入到我们的类中!

org.springframework.bootspring-boot-configuration-processortrue9、确认以上配置都OK之后,我们去测试类中测试一下:

@SpringBootTestclassDemoApplicationTests{@AutowiredPersonperson;//将person自动注入进来@TestpublicvoidcontextLoads(){System.out.println(person);//打印person信息}}结果:所有值全部注入成功!

yaml配置注入到实体类完全OK!

课堂测试:

1、将配置文件的key值和属性的值设置为不一样,则结果输出为null,注入失败

2、在配置一个person2,然后将@ConfigurationProperties(prefix="person2")指向我们的person2;

@PropertySource:加载指定的配置文件;

@configurationProperties:默认从全局配置文件中获取值;

1、我们去在resources目录下新建一个person.properties文件

name=kuangshen2、然后在我们的代码中指定加载person.properties文件

@PropertySource(value="classpath:person.properties")@Component//注册beanpublicclassPerson{@Value("${name}")privateStringname;......}3、再次输出测试一下:指定配置文件绑定成功!

配置文件还可以编写占位符生成随机数

person:name:qinjiang${random.uuid}#随机uuidage:${random.int}#随机inthappy:falsebirth:2000/01/01maps:{k1:v1,k2:v2}lists:-code-girl-musicdog:name:${person.hello:other}_旺财age:1回顾properties配置我们上面采用的yaml方法都是最简单的方式,开发中最常用的;也是springboot所推荐的!那我们来唠唠其他的实现方式,道理都是相同的;写还是那样写;配置文件除了yml还有我们之前常用的properties,我们没有讲,我们来唠唠!

【注意】properties配置文件在写中文的时候,会有乱码,我们需要去IDEA中设置编码格式为UTF-8;

settings-->FileEncodings中配置;

测试步骤:

1、新建一个实体类User

@Component//注册beanpublicclassUser{privateStringname;privateintage;privateStringsex;}2、编辑配置文件user.properties

user1.name=kuangshenuser1.age=18user1.sex=男3、我们在User类上使用@Value来进行注入!

@Component//注册bean@PropertySource(value="classpath:user.properties")publicclassUser{//直接使用@value@Value("${user.name}")//从配置文件中取值privateStringname;@Value("#{9*2}")//#{SPEL}Spring表达式privateintage;@Value("男")//字面量privateStringsex;}4、Springboot测试

@SpringBootTestclassDemoApplicationTests{@AutowiredUseruser;@TestpublicvoidcontextLoads(){ System.out.println(user);}}结果正常输出:

@Value这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比图

1、@ConfigurationProperties只需要写一次即可,@Value则需要每个字段都添加

2、松散绑定:这个什么意思呢比如我的yml中写的last-name,这个和lastName是一样的,-后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下

3、JSR303数据校验,这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性

4、复杂类型封装,yml中可以封装对象,使用value就不支持

结论:

配置yml和配置properties都可以获取到值,强烈推荐yml;

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value;

如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!

Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式;

使用数据校验,可以保证数据的正确性;

profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;

多配置文件

我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml,用来指定多个环境版本;

例如:

application-test.properties代表测试环境配置

application-dev.properties代表开发环境配置

但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;

我们需要通过一个配置来选择需要激活的环境:

#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;spring.profiles.active=dev六、SpringBoot配置6.1、配置文件加载位置外部加载配置文件的方式十分多,我们选择最常用的即可,在开发的资源文件中进行配置!

官方外部配置文件说明参考文档

springboot启动会扫描以下位置的application.properties或者application.yml文件作为Springboot的默认配置文件:

优先级1:项目路径下的config文件夹配置文件优先级2:项目路径下配置文件优先级3:资源路径下的config文件夹配置文件优先级4:资源路径下配置文件优先级由高到底,高优先级的配置会覆盖低优先级的配置;

SpringBoot会从这四个位置全部加载主配置文件;

一但这个配置类生效;这个配置类就会给容器中添加各种组件;

这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;

配置文件能配置什么就可以参照某个功能对应的这个属性类

1、SpringBoot启动会加载大量的自动配置类

2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

xxxxAutoConfigurartion:自动配置类;给容器中添加组件

那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。

我们怎么知道哪些自动配置类生效?

我们可以通过启用debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;

jar:webapp

自动装配

SpringBoot到底帮我们配置了什么?我们能不能修改?能修改哪些东西?能不能扩展?

要解决问题:

系统默认可以放在以下位置,自定义后会失效

"classpath:/META-INF/resources/"====>通过webjars实现"classpath:/resources/""classpath:/resources/static/""classpath:/resources/public/"首页定制"classpath:/resources/static/""classpath:/resources/public/"模版引擎Thymeleaf导入包

练习测试:

1、我们编写一个Controller,放一些数据

@RequestMapping("/t2")publicStringtest2(Mapmap){//存入数据map.put("msg","

Hello

");map.put("users",Arrays.asList("qinjiang","kuangshen"));//classpath:/templates/test.htmlreturn"test";}2、测试页面取出数据

importjava.util.Locale;@ConfigurationpublicclassMyMvcConfigimplementsWebMvcConfigurer{//ViewResolver:实现了视图解析器接口的类,我们就可以把它看作视图解析器@BeanpublicViewResolvermyViewResolve(){returnnewMyViewResolve();}//自定义了一个自己的视图解析器的静态内部类MyViewResolvepublicstaticclassMyViewResolveimplementsViewResolver{@OverridepublicViewresolveViewName(StringviewName,Localelocale)throwsException{returnnull;}}具体实现:

//如果我们要扩展springmvc,官方建议我们这样去做!@ConfigurationpublicclassMyMvcConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddViewControllers(ViewControllerRegistryregistry){registry.addViewController("test1").setViewName("test");}}自定义的配置日期格式化

#自定义的配置日期格式化spring:mvc:format:date-time:yyyy-MM-ddHH:mm:ss小demo

org.springframework.bootspring-boot-starter-jdbc除此之外还有有数据库的driver

==============================================

配置yaml:

spring:datasource:username:rootpassword:root1@12url:jdbc:mysql://localhost:3306/mybatisuseUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Drivertest测试:

@AutowiredDataSourcedataSource;@TestvoidcontextLoads()throwsSQLException{//查看一下默认的数据源:classcom.zaxxer.hikari.HikariDataSourceSystem.out.println(dataSource.getClass());//获得数据库的连接Connectionconnection=dataSource.getConnection();System.out.println(connection);//xxxxTemplate:SpringBoot已经配置好模版bean,拿来即用CURD//关闭数据库的连接connection.close();}使用template查询数据库多的user表的所有数据

@RestControllerpublicclassJDBCController{@AutowiredJdbcTemplatejdbcTemplate;//查询数据库的所有信息@GetMapping("userlist")publicList>userList(){Stringsql="select*fromuser";List>listMaps=jdbcTemplate.queryForList(sql);returnlistMaps;}}2.DruidDruid为监控而生的数据库连接池,它是阿里巴巴开源平台上的一个项目。Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能.它可以替换DBCP和C3P0连接池。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

配置Druid监控页面

spring:datasource:username:rootpassword:root1@12url:jdbc:mysql://localhost:3306/mybatisuseUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Driver#指定数据源type:com.alibaba.druid.pool.DruidDataSource#数据源其他配置druid:#SpringBoot默认是不注入这些的,需要自己绑定#druid数据源专有配置initialSize:5minIdle:5maxActive:20maxWait:60000timeBetweenEvictionRunsMillis:60000minEvictableIdleTimeMillis:300000validationQuery:SELECT1FROMDUALtestWhileIdle:truetestOnBorrow:falsetestOnReturn:falsepoolPreparedStatements:true#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入#如果允许报错,java.lang.ClassNotFoundException:org.apache.Log4j.Properity#则导入log4j依赖就行filters:stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize:20useGlobalDataSourceStat:trueconnectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500写一个JDBC的请求

@RestControllerpublicclassJDBCController{@AutowiredJdbcTemplatejdbcTemplate;//查询数据库的所有信息@GetMapping("userlist")publicList>userList(){Stringsql="select*frommybatis.user";List>listMaps=jdbcTemplate.queryForList(sql);returnlistMaps;}}配置config

导入包

org.springframework.bootspring-boot-starter-jdbcorg.springframework.bootspring-boot-starter-weborg.mybatis.spring.bootmybatis-spring-boot-starter2.2.2配置application

spring:datasource:username:rootpassword:root1@12url:jdbc:mysql://localhost:3306/mybatisuseUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Driver##整合mybatismybatis:type-aliases-package:com.pojomapper-locations:classpath:mybatis/mapper/*.xml写入实体类

@Data@AllArgsConstructor@NoArgsConstructorpublicclassUser{privateintid;privateStringname;privateStringpwd;}写一个mapper接口

packagecom.mapper;importcom.pojo.User;importorg.apache.ibatis.annotations.Mapper;importorg.springframework.stereotype.Repository;importjava.util.List;//这个注解表示了这是一个mybatis的mapper类@Mapper@RepositorypublicinterfaceUserMapper{ListqueryUserList();UserqueryUserById(intid);intaddUser(Useruser);intupdateUser(Useruser);intdeleteUser(intid);}在在资源目录mybatis/mapper/中写去UserMapper的实现mapper

在web开发中,安全第一位!过滤器,拦截器~

功能性需求:否

做网站:安全应该在什么时候考虑设计?设计之初!

shiro、SpringSecurity:两个很像,除了类不一样,名字不一样

AOP:横切~配置类

简介

SpringSecurity是针对Spring项目的安全框架,也是SpringBoot底层安全模块默认的技术选型,它可以实现强大的Web安全控制,对于我们安全控制,我们仅需要引入pring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理

‘’认证“(Authentication)

这个概念是通用的,而不是只在SpringSecurity种存在

测试:

开启无权限的模块屏蔽以及用户名的展示

导入thymeleaf-extras-springsecurity5

Quickstart核心:

org.apache.shiroshiro-spring1.5.3org.springframework.bootspring-boot-starter-thymeleaforg.springframework.bootspring-boot-starter-web编写一个controller并写出带有thymeleaf的html

Title

add

=================Title

update

配置shiroConfig

创建一个数据库

DROPTABLEIFEXISTS`user`;/*!40101SET@saved_cs_client=@@character_set_client*/;/*!50503SETcharacter_set_client=utf8mb4*/;CREATETABLE`user`(`id`intNOTNULL,`name`varchar(30)DEFAULTNULL,`pwd`varchar(30)DEFAULTNULL,`perms`varchar(100)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb3;/*!40101SETcharacter_set_client=@saved_cs_client*/;----Dumpingdatafortable`user`--LOCKTABLES`user`WRITE;/*!40000ALTERTABLE`user`DISABLEKEYS*/;INSERTINTO`user`VALUES(1,'张三','123123','user:update'),(2,'李四','123456',NULL),(3,'王五','123456',NULL),(4,'赵六','123456',NULL),(6,'找牛','1221212',NULL),(7,'admin','123456','user:add');/*!40000ALTERTABLE`user`ENABLEKEYS*/;UNLOCKTABLES;导入数据库的依赖以及druid链接池

mysqlmysql-connector-javaruntimecom.alibabadruid-spring-boot-starter1.1.10数据库配置

spring:datasource:username:rootpassword:root1@12url:jdbc:mysql://localhost:3306/mybatisuseUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Driver#指定数据源type:com.alibaba.druid.pool.DruidDataSource#数据源其他配置druid:#SpringBoot默认是不注入这些的,需要自己绑定#druid数据源专有配置initialSize:5minIdle:5maxActive:20maxWait:60000timeBetweenEvictionRunsMillis:60000minEvictableIdleTimeMillis:300000validationQuery:SELECT1FROMDUALtestWhileIdle:truetestOnBorrow:falsetestOnReturn:falsepoolPreparedStatements:true#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入#如果允许报错,java.lang.ClassNotFoundException:org.apache.Log4j.Properity#则导入log4j依赖就行filters:stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize:20useGlobalDataSourceStat:trueconnectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500mybatis配置

mybatis.type-aliases-package=com.pojomybatis.mapper-locations=classpath:mapper/*.xml修改index界面

Title

unauthorization

配置数据库实体类

@Data@AllArgsConstructor@NoArgsConstructorpublicclassUser{privateintid;privateStringname;privateStringpwd;privateStringperms;}写一个mapper接口

@Repository@MapperpublicinterfaceUserMapper{publicUserqueryUserByName(Stringname);}实现:

publicinterfaceUserService{publicUserqueryUserByName(Stringname);}实现:

@ServicepublicclassUserServiceImplimplementsUserService{@AutowiredUserMapperuserMapper;@OverridepublicUserqueryUserByName(Stringname){returnuserMapper.queryUserByName(name);}}重写controller

学习目标:

前后端分离

Vue+SpringBoot

后端时代:前端只用管理静态页面html>后端。模版引擎JSP>后端是主力

前后端分离时代:

产生一个问题:

解决方案:

首先指定schema【(计划或理论的)提要,纲要】,实时更新最新API,降低集成的风险

早些年:指定word计划文档

前后端分离:

在项目使用Swagger需要springfox;

新建一个SpringBootWeb项目

spring:mvc:pathmatch:matching-strategy:ant_path_matcher编写一个hello工程

配置Swagger的Config

Swagger的bean实例Docket

//配置了Swagger的docket的bean实例@BeanpublicDocketdocket(){returnnewDocket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()//RequestHandlerSelectors,配置要扫描的接口方式//basePackage:指定要扫描的包//any():扫面全部//none():不扫描//withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象//withMethodAnnotation:扫描方法上的注解.apis(RequestHandlerSelectors.basePackage("com.controller"))//选择路径扫描,//.paths(PathSelectors.ant("")).build();}Docket.enable

是否启动swagger

//配置了Swagger的docket的bean实例@BeanpublicDocketdocket(){returnnewDocket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(false)//不启动}根据开发环境配置是否启动swager

如在测试环境中

spring:mvc:pathmatch:matching-strategy:ant_path_matcherprofiles:active:dev@BeanpublicDocketdocket(Environmentenvironment){//设置要显示的swagger环境Profilesprofiles=Profiles.of("dev");//获取项目的环境,通过environment.acceptsProfiles判断是否处在自己设定的环境当中booleanflag=environment.acceptsProfiles(profiles);returnnewDocket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(flag).select().apis(RequestHandlerSelectors.basePackage("com.controller")).build();}配置API文档的分组

Docket.groupName配置多个分组就创建多个Docket对象

配置实体类

@Data@AllArgsConstructor@NoArgsConstructor//@api()注释@ApiModel("用户实体类")publicclassUser{@ApiModelProperty("用户名属性")privateStringusername;@ApiModelProperty("密码属性")privateStringpassword;}重写controller

Swagger是一个优秀的工具,几乎所有大公司都有使用它

【注意点】在正式发布的时候,注意关闭Swagger

@ServicepublicclassAsyncService{//高数spring这是一个异步的方法@Asyncpublicvoidhello(){try{Thread.sleep(3000);}catch(InterruptedExceptione){thrownewRuntimeException(e);}System.out.println("数据正在处理...");}}配置一个controller@RestControllerpublicclassAsyncController{@AutowiredAsyncServiceasyncService;@RequestMapping("/")publicStringhello(){asyncService.hello();//延时三秒return"ok";}}在主类中配置到注解@EnableAsync@SpringBootApplication@EnableAsync//开启异步注解任务publicclassTaskSpringBootApplication{publicstaticvoidmain(String[]args){SpringApplication.run(TaskSpringBootApplication.class,args);}}2、定时任务两个核心接口

TaskScheduler【任务调度】

TaskExecutor【任务执行】

org.springframework.bootspring-boot-starter-mail2.配置application.properties

@AutowiredJavaMailSenderImplmailSender;@TestvoidcontextLoads(){SimpleMailMessagemailMessage=newSimpleMailMessage();mailMessage.setSubject("邮件测试!");mailMessage.setText("这是一封测试邮件~");mailMessage.setTo("接收@qq.com");mailMessage.setFrom("发送@163.com");mailSender.send(mailMessage);}4.测试复杂邮件MimeMessage

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。

当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。此时需要一个服务注册中心,动态地注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。

当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。这时,需要自动画出应用间的依赖关系图,以帮助架构师理清关系。

以上是Dubbo最基本的几个需求。

RPC(RemoteProcedureCallProtocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。

比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

那么我们至少从这样的描述中挖掘出几个要点:

其实这是应用开发到一定的阶段的强烈需求驱动的。如果我们开发简单的单一应用,逻辑简单、用户不多、流量不大,那我们用不着。当我们的系统访问量增大、业务增多时,我们会发现一台单机运行此系统已经无法承受。此时,我们可以将业务拆分成几个互不关联的应用,分别部署在各自机器上,以划清逻辑并减小压力。此时,我们也可以不需要RPC,因为应用之间是互不关联的。

当我们的业务越来越多、应用也越来越多时,自然的,我们会发现有些功能已经不能简单划分开来或者划分不出来。此时,可以将公共业务逻辑抽离出来,将之组成独立的服务Service应用。而原有的、新增的应用都可以与那些独立的Service应用交互,以此来完成完整的业务功能。

所以此时,我们急需一种高效的应用程序之间的通讯手段来完成这种需求,所以你看,RPC大显身手的时候来了!

其实描述的场景也是服务化、微服务和分布式系统架构的基础场景。即RPC框架就是实现以上结构的有力方式。

要让网络通信细节对使用者透明,我们需要对通信细节进行封装,我们先看下一个RPC调用的流程涉及到哪些通信细节:

RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。

下面是网上的另外一幅图,感觉一目了然:

一、Dubbo是什么?Dubbo是阿里巴巴开源的基于Java的高性能RPC(一种远程调用)分布式服务框架(SOA),致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。二、为什么要用Dubbo?因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了Netty、Zookeeper,保证了高性能高可用性。

三、Dubbo里面有哪几种节点角色?

下载源码

cddubbo-samples/dubbo-samples-spring-bootmvncleanpackage运行Provider进入dubbo-samples-spring-boot-provider/target目录并启动java进程,端口号7001

cd./dubbo-samples-spring-boot-providerjava-jar./target/dubbo-samples-spring-boot-provider-1.0-SNAPSHOT.jar4.zookeeper顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象)、Hive(蜜蜂)、pig(小猪)的管理员,ApacheHbase和ApacheSolr的分布式集群都用到了zookeeper;Zookeeper:是一个分布式的、开源的程序协调服务,是hadoop项目下的一个子项目。他提供的主要功能包括:配置管理、名字服务、分布式锁、集群管理。

配置一个conifg文件

#ThenumberofmillisecondsofeachticktickTime=2000#Thenumberofticksthattheinitial#synchronizationphasecantakeinitLimit=10#Thenumberofticksthatcanpassbetween#sendingarequestandgettinganacknowledgementsyncLimit=5#thedirectorywherethesnapshotisstored.#donotuse/tmpforstorage,/tmphereisjust#examplesakes.dataDir=/tmp/zookeeper#theportatwhichtheclientswillconnectclientPort=2181然后开启服务

./zkServer.shstart

接着连接客户

测试

创建一个空项目,分别创建两个springBoot的模块分别是provideServer与consumerServer

在provideServer新建一个接口并且实现:

packagecom.privoder.service;publicinterfaceTicketService{publicStringgetTicket();}==================================================================packagecom.privoder.service;publicclassTicketServiceImplimplementsTicketService{@OverridepublicStringgetTicket(){return"《TicketService==>getTicket》";}}

THE END
1.宠物狗怎么坐飞机?揭秘新疆旅行宠物托运全过程,800块钱托回家...本来想让狗狗坐火车,奈何手续太麻烦 开车狂浪 关注6人97万粉丝关注 评论·14 提交评论 聽说南方有你 黄牛真是个好东西, 2020-11-11回复1条回复举报48人 点赞 勇往直前的小溪流 新疆就是这种效率,在内地待过的人,来到新疆会受不了的。 2020-11-30回复1条回复举报23人 点赞 linkdesign 大狗托运费用多少钱...https://www.dongchedi.com/video/6893513267189121540
2.如何带宠物去旅游乘坐飞机: 1. 做好疫苗工作,办理有效健康证明以及疫苗注射证明。疫苗证明有效期最长为七天,乘坐日期必须在有效期间; 2. 提前向航空公司申请宠物舱位; 3. 准备正规的航空箱; 4. 登机前根据宠物情况,询问兽医是否需要打镇定剂,登机前三https://www.autohome.com.cn/ask/5351750.html
3.网站地图国内国际宠物托运随机空运邮寄回国清关推荐宠物国际托运流程图(国内国际 宠物托运)|上海国际宠物托运[指南].doc 国际宠物托运烟台到烟台(烟台托运宠物价格表)|武汉到烟台轿车托运多少钱,托运一辆家轿要多少钱 宠物机场托运(宠物机场托运多少钱)|飞机场猫咪托运多少钱 国际宠物托运公司事件视频(国内国际宠物托运公司企查查)|深圳宠物托运 广州宠物国际托运中介公...http://www.dogcat-pet.com/sitemap.html
1.申请宠物托运国际快递流程(申请宠物托运国际快递流程图)宠物出国托运去马来西亚需要什么手续? 宠物国际托运大概要多少钱?需要办理些什么手续? 飞机托运宠物猫怎么办理? 国航或者联航的宠物托运具体流程,有经验的朋友进来帮忙谢谢? 宠物空运手续办理哪些流程呢? 飞机托运狗需要什么手续? 跨省运宠物有什么快递? 宠物狗狗托运费用及详细流程? https://www.guojiexpress.com/5974/
2.狗狗领养合同有法律效力吗符合特定条件下的狗狗领养协议合法性毋庸置疑。首先,其内容需符合法定标准,不得违背国家强制法规与社会公认道德准则;其次,缔约双方须具备相应民事行为能力,且在交易过程中的意愿表达真实可信。倘若合同中明确、详细地规定了领养方及送养方的各自责任与权益(例如领养方应提供的饲养环境,送养方需履行的信息披露等),且双方...https://v.66law.cn/wenda/3460279.aspx
3.玄幻之无敌熊孩子三,女逼穴软件撅,希岛动态图 四,草莓AⅤ,闺蜜哦┅┅快┅┅用力啊┅┅ 五,啊~慢点h,嗯嗯~嗯啊快点4p 六,男生把他的坤坤放进女生的嘴巴里面强迫,久久涩爱蜜芽 七,欧美黄色大片91 【联系我们】 客服热线:133-2881-646 加载更多 土耳其高清色图在线视频16p ...http://hongjinting.com/birske6268060.htm
4.鹿爷,你家夫人又不乖男人把女人捅到爆爽GIFXXOO动图 啪啪啪视频喷水潮吹深喉 417.3MB 564好评 4488电影在线观看免费网站 国产一区二区政 男女啪啪啪动态图 366.95MB 243好评 国产体内射精视频 成都熟人视频 今日积淀 117.99MB 324好评 女人张开腿被男人草 嗯啊哈取悦我 一级二级三级视频在线观看 ...http://huaweiseeds.com/apldfe5545740.html
5.快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用,本文介绍了如何使用ModelBox开发一个动物目标检测的AI应用,从而掌握图片标注、数据处理和模型训练方法,以及对应的推理应用逻辑。https://blog.51cto.com/u_15214399/11123721
6.看《大江大河》,忆那年那月(完结及第二部的期望)(大江大河)剧评题外话《大江大河》:总有些画面很戳泪点,因为纪录了曾经的时光和变迁。中华文明的发展离不开大河文明。巨变四十年,中国大河文明渗透和碰撞了海洋文明。沧桑话巨变,一人一江河。弄潮三子的故事,是时代的缩影,受原生家庭的羁绊有时代局限,在开放大潮中人生命运和经历各自不同。但中国的文明从农耕时代开始,大家都是站在...https://movie.douban.com/review/9813512/
7.qt.uxinc.cn/mokie/84605.html产品逻辑是提供端到端全栈解决方案,实现实验室所有流程的闭环管理,从实验设计到执行、分析、决策和结果生成,全流程贯通,高效协同。对于公司的核心产品LIMS系列...纸飞机大赛中,同学们用心地折纸、粘贴,将自己的智慧和创意折进每一架纸飞机。随着裁判的一声令下,纸飞机在空中划出一道道优美的弧线,有的滑翔平稳,有的...http://qt.uxinc.cn/mokie/84605.html
8.人靠衣装截至目前,已在该专栏公示行政复议指南、行政复议文书模板及工作流程图等便民服务内容,公示行政复议决定书 15 份。通过主动公开行政复议案件处理情况,积极接受社会各界监督,有效提升了行政复议工作的公信力和社会认可度。 三、慎重开展各类极限运动。岩钓、跳伞、冲浪、蹦极、潜水、漂流等是新西兰特色冒险类旅游项目,但...http://www.mepprice.cn/icomapl/47811.html
9.www.whnk.cn/xxxr19487731培训中,除了组织法规制度、监督程序方法等基本知识学习外,他们重点围绕招标询价、市场调查等方面进行专项培训,针对每一类敏感事项规范“权力运行流程图”,让每名基层风气监督员都能了解掌握对应的专业知识和监督重点。 最终,数十名官兵通过考核拿到了旅纪委监委发放的上岗资格证书。旅纪检监察科科长介绍:“平时,他们是各...http://www.whnk.cn/xxxr19487731
10.快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用create.bat工具使用时,-t infer即表示创建的是推理功能单元;-n xxx_infer表示创建的功能单元名称为xxx_infer;-p yolov7_infer表示所创建的功能单元属于yolov7_infer应用。 a. 下载转换好的模型 运行此Notebook下载转换好的ONNX格式模型 b. 修改模型配置文件 ...https://blog.csdn.net/devcloud/article/details/139641426