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....项目实践——图像分类项目的指导文档图像分类任务实验同时完成任务一到任务四的流程图 ?任务一内容:计算代码运行时间 ?任务的主体代码在check_images模块里,在此模块:添加计算程序运行时间的相应代码(也就是标记为TODO1的地方)。 编写完毕后,该代码将计算程序的总运行时间。后续该代码将衡量三个算法中的每个算法对pet_images文件夹中的所有图像进行分类所需的时间...https://blog.csdn.net/aiqq136/article/details/114596795
2.小学四年级英语说课稿我将采用情景法、全身反应法、直观法等教学方法,以学生为主体,以What’s this ?这个话题为核心,以语言功能为主线,以任务型活动为媒介,从学生的学习兴趣、生活经验和认知水平出发,使学生通过感知、体验、实践、参与、合作与交流的方式实现任务目标,使课堂活起来,让学生动起来,从而达成上述的知识与技能目标。 https://www.ruiwen.com/yingyushuokegao/6133017.html
3.docker迅雷下载宝docker迅雷还能用吗小星星的技术博客一、思路流程 二、问题 三、深信服一面 四、SQL注入防护 五、为什么参数化查询可以防止SQL注入 六、SQL头注入点 七、盲注是什么?怎么盲注? 八、宽字节注入产生原理以及根本原因 九、SQL如何写shell/单引被过滤怎么办 十、XSS 十一、CSRF 十二、SSRF https://blog.51cto.com/u_87634/11215564
4.幼儿园英语教案汇编15篇情景教学法、任务教学法、讲授练习法 【教学准备】 PPT课件,卡片,录音机 【课时安排】 一课时 【教学流程】 Part1、Warm—UPandreviewing 1、Greeting T:Classbegins。 T:Hello,boysandgirls! Ss:Hello,teacher! T:Howareyou? Ss:I’mfine,andyou? https://www.yuwenmi.com/jiaoan/youeryuan/3643052.html
5.魔兽世界怀旧服环形山恶魔怎么打SS弓任务环形山恶魔打法攻略很多玩家对于猎人史诗弓任务的完成方法还不是很了解,想知道环形山的女人和狗要怎么打,今天为大家带来了魔兽世界怀旧服SS弓任务环形山恶魔打法,感兴趣的玩家快来了解一下吧。 魔兽世界怀旧服SS弓任务环形山恶魔打法 环形山恶魔迷人的西蒙妮主要考验玩家应对多个敌人的能力,打这个BOSS的核心思路是先杀狗后杀女人,杀狗主要...https://www.jb51.net/gonglue/708351.html
6.ss的宝宝任务必须做吗NGA玩家社区p3阶段,打三脸的p2,需要术士的狗 空蓝之前瞬招狗来吃boss的盾+打断 一个召唤任务也用不了两个...https://bbs.nga.cn/read.php?tid=29210399
7.GitHub泡泡狗机场是一款成立于2022 年 4 月的IPLC 专线机场,采用SS 协议。它计划上线华为云专线,提供更高端且优质的服务,特别是在流媒体解锁方面表现优异。泡泡狗的套餐种类丰富,既有包月套餐,也提供了按量付费的个性化套餐。按量付费的套餐不限时长,用完为止,非常灵活。 https://github.com/mmhunter3515/testrepository
8.弹性云服务器(ECS)8.3.0用户指南(for华为云Stack8.3.0)02...各步骤对应的任务如下: 1. 在ECS界面上提交创建申请,对应上图中的步骤1。 2. 创建网络资源,对应上图中的步骤2~3。 a. 组合API中ECS的接口调用组合API中VPC的接口。 b. VPC接口调用Neutron创建EIP、端口等网络资源。文档版本 02 (2023-10-26) 版权所有 ? 华为云计算技术有限公司 9 弹性...https://support.huawei.com/enterprise/zh/doc/EDOC1100326709?section=k002