当前位置: 首页 > news >正文

福州网站开发si7.cc上海技术公司做网站

福州网站开发si7.cc,上海技术公司做网站,网上商店系统设计,做网站推广利润文章目录 1.SpringBoot简介1.1原有Spring优缺点分析1.1.1Spring优点1.1.2Spring缺点 1.2SpringBoot概述1.2.1SpringBoot解决上述Spring的缺点1.2.2SpringBoot特点1.2.3SpringBoot核心功能 2.SpringBoot快速入门2.1代码实现2.1.1创建Maven工程2.1.2添加SpringBoot的起步依赖2.1.… 文章目录 1.SpringBoot简介1.1原有Spring优缺点分析1.1.1Spring优点1.1.2Spring缺点 1.2SpringBoot概述1.2.1SpringBoot解决上述Spring的缺点1.2.2SpringBoot特点1.2.3SpringBoot核心功能 2.SpringBoot快速入门2.1代码实现2.1.1创建Maven工程2.1.2添加SpringBoot的起步依赖2.1.3编写SpringBoot引导类2.1.4编写controller2.1.5测试 2.2快速入门解析2.2.1引导类解析2.2.2工程热部署解析 2.3使用Idea快速创建SpringBoot项目自动导入依赖 3.SpringBoot原理分析3.1起步依赖原理分析3.1.1分析spring-boot-starter-parent3.1.2分析spring-boot-starter-web 3.2自动配置原理解析 4.SpringBoot的配置文件4.1SpringBoot配置文件的类型及作用4.1.1配置文件类型及作用4.1.2 application.properties4.1.3 application.yml或application.yaml4.1.4读取配置文件数据 4.2配置文件的加载顺序4.2.1项目内配置文件加载顺序1不同目录的配置文件的加载顺序2同一目录、不同后缀的配置文件加载顺序 4.2.2外部配置文件1命令行参数2spirng.config.location 4.3多环境配置4.3.1多文件配置多个环境4.3.2单个文件配置多个环境4.3.3补充命令行指定 5.SpringBoot整合其他技术5.1SpringBoot整合Junit5.1.1添加依赖5.1.2编写测试类5.1.3控制台 5.2SpringBoot整合Mybatis5.2.1添加依赖5.2.2添加数据库驱动5.2.3添加数据库连接5.2.4创建user表5.2.5创建实体Bean5.2.6编写Mapper接口5.2.7配置Mapper映射文件5.2.8在application.properties添加映射文件信息5.2.9controller层5.2.10测试 5.3SpringBoot整合Redis5.4SpringBoot整合Mybatis Plus5.4.1导入依赖5.4.2yml配置5.4.3用户信息实体5.4.4配置类5.4.5启动类5.4.6Dao层5.4.7Service层5.4.8扩展Mybatis Plus的核心 5.5SpringBoot整合RabbitMQ 6.SpringBoot实现拦截器6.1拦截器介绍6.2拦截器作用6.3自定义拦截器6.3.1LogInterceptor类6.3.2OldLoginInterceptor类6.3.3配置拦截器 6.4应用6.4.1性能监控6.4.2登录检测 7.文件上传/下载7.1文件上传/下载流程概述7.1.1文件上传7.1.2文件下载 7.2实现过程7.2.1添加依赖7.2.2配置文件上传大小限制7.2.3上传控制器7.2.4下载控制器 8.SpringBoot访问静态资源8.1何为静态资源8.2设置访问静态资源的两种方法8.2.1application设置方法1配置详讲2实践3优缺点 8.2.2设置配置类方法1方法介绍2实践3优缺点 1.SpringBoot简介 1.1原有Spring优缺点分析 1.1.1Spring优点 Spring是Java企业版Java Enterprise EditionJEE也称J2EE的轻量级代替品。无需开发重量级的Enterprise JavaBeanEJBSpring为企业级Java开发提供了一种相对简单的方法通过依赖注入和面向切面编程用简单的Java对象Plain Old Java ObjectPOJO实现了EJB的功能。 1.1.2Spring缺点 虽然Spring的组件代码是轻量级的但它的配置却是重量级的。一开始Spring用XML配置而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置这是一种类型安全的可重构配置方式可以代替XML。 所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样Spring实用但与此同时它要求的回报也不少。 除此之外项目的依赖管理也是一件耗时耗力的事情。在环境搭建时需要分析要导入哪些库的坐标而且还需要分析导入与之有依赖关系的其他库的坐标一旦选错了依赖的版本随之而来的不兼容问题就会严重阻碍项目的开发进度。 1.2SpringBoot概述 1.2.1SpringBoot解决上述Spring的缺点 SpringBoot对上述Spring的缺点进行的改善和优化基于约定优于配置的思想可以让开发人员不必在配置与逻辑业务之间进行思维的切换全身心的投入到逻辑业务的代码编写中从而大大提高了开发的效率一定程度上缩短了项目周期。 1.2.2SpringBoot特点 为基于Spring的开发提供更快的入门体验开箱即用没有代码生成也无需XML配置。同时也可以修改默认值来满足特定的需求提供了一些大型项目中常见的非功能性特性如嵌入式服务器、安全、指标健康检测、外部配置等SpringBoot不是对Spring功能上的增强而是提供了一种快速使用Spring的方式 1.2.3SpringBoot核心功能 起步依赖 起步依赖本质上是一个Maven项目对象模型Project Object ModelPOM定义了对其他库的传递依赖这些东西加在一起即支持某项功能。简单的说起步依赖就是将具备某种功能的坐标打包到一起并提供一些默认的功能。 自动配置 Spring Boot的自动配置是一个运行时更准确地说是应用程序启动时的过程考虑了众多因素才决定Spring配置应该用哪个不该用哪个。该过程是Spring自动完成的。 2.SpringBoot快速入门 2.1代码实现 2.1.1创建Maven工程 使用idea工具创建一个maven工程该工程为普通的java工程 2.1.2添加SpringBoot的起步依赖 SpringBoot要求项目要继承SpringBoot的起步依赖spring-boot-starter-parent parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.0.1.RELEASE/version /parentSpringBoot要集成SpringMVC进行Controller的开发所以项目要导入web的启动依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency /dependencies2.1.3编写SpringBoot引导类 SpringBootApplication public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class);}}2.1.4编写controller Controller public class QuickStartController {RequestMapping(/quick)ResponseBodypublic String quick(){return springboot 访问成功!;}}2.1.5测试 执行SpringBoot起步类的主方法控制台打印日志如下 通过日志发现Tomcat started on port(s): 8080 (http) with context path ‘’ tomcat已经起步端口监听8080web应用的虚拟工程名称为空 打开浏览器访问url地址为http://localhost:8080/quick 2.2快速入门解析 2.2.1引导类解析 SpringBootApplication标注SpringBoot的启动类该注解具备多种功能后面详细剖析SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类参数为SpringBoot启动类的字节码对象 2.2.2工程热部署解析 可以在修改代码后不重启就能生效在 pom.xml 中添加如下配置就可以实现这样的功能我们称之为热部署 !--热部署配置-- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId /dependency注意IDEA进行SpringBoot热部署失败原因 出现这种情况并不是热部署配置问题其根本原因是因为Intellij IEDA默认情况下不会自动编译需要对IDEA进行自动编译的设置如下 然后 ShiftCtrlAlt/选择Registry 2.3使用Idea快速创建SpringBoot项目自动导入依赖 通过idea快速创建的SpringBoot项目的pom.xml中已经导入了我们选择的web的起步依赖的坐标 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.itheima/groupIdartifactIdspringboot_quick2/artifactIdversion0.0.1-SNAPSHOT/versionpackagingjar/packagingnamespringboot_quick2/namedescriptionDemo project for Spring Boot/descriptionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.0.1.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingjava.version9/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project可以使用快速入门的方式创建Controller进行访问此处不再赘述 3.SpringBoot原理分析 3.1起步依赖原理分析 3.1.1分析spring-boot-starter-parent 按住Ctrl点击pom.xml中的spring-boot-starter-parent跳转到了spring-boot-starter-parent的pom.xmlxml配置如下只摘抄了部分重点配置 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.0.1.RELEASE/versionrelativePath../../spring-boot-dependencies/relativePath /parent按住Ctrl点击pom.xml中的spring-boot-starter-dependencies跳转到了spring-boot-starter-dependencies的pom.xmlxml配置如下只摘抄了部分重点配置 propertiesactivemq.version5.15.3/activemq.versionantlr2.version2.7.7/antlr2.versionappengine-sdk.version1.9.63/appengine-sdk.versionartemis.version2.4.0/artemis.versionaspectj.version1.8.13/aspectj.versionassertj.version3.9.1/assertj.versionatomikos.version4.0.6/atomikos.versionbitronix.version2.1.4/bitronix.versionbuild-helper-maven-plugin.version3.0.0/build-helper-maven-plugin.versionbyte-buddy.version1.7.11/byte-buddy.version... ... ... /properties dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot/artifactIdversion2.0.1.RELEASE/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-test/artifactIdversion2.0.1.RELEASE/version/dependency... ... .../dependencies /dependencyManagement buildpluginManagementpluginsplugingroupIdorg.jetbrains.kotlin/groupIdartifactIdkotlin-maven-plugin/artifactIdversion${kotlin.version}/version/pluginplugingroupIdorg.jooq/groupIdartifactIdjooq-codegen-maven/artifactIdversion${jooq.version}/version/pluginplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion2.0.1.RELEASE/version/plugin... ... .../plugins/pluginManagement /build从上面的spring-boot-starter-dependencies的pom.xml中我们可以发现一部分坐标的版本、依赖管理、插件管理已经定义好所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。所以起步依赖的作用就是进行依赖的传递。 3.1.2分析spring-boot-starter-web 按住Ctrl点击pom.xml中的spring-boot-starter-web跳转到了spring-boot-starter-web的pom.xmlxml配置如下只摘抄了部分重点配置 ?xml version1.0 encodingUTF-8? project xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancemodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starters/artifactIdversion2.0.1.RELEASE/version/parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion2.0.1.RELEASE/versionnameSpring Boot Web Starter/namedependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.0.1.RELEASE/versionscopecompile/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-json/artifactIdversion2.0.1.RELEASE/versionscopecompile/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdversion2.0.1.RELEASE/versionscopecompile/scope/dependencydependencygroupIdorg.hibernate.validator/groupIdartifactIdhibernate-validator/artifactIdversion6.0.9.Final/versionscopecompile/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.0.5.RELEASE/versionscopecompile/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.0.5.RELEASE/versionscopecompile/scope/dependency/dependencies /project从上面的spring-boot-starter-web的pom.xml中我们可以发现spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了同样体现了依赖传递的作用 3.2自动配置原理解析 按住Ctrl点击查看启动类MySpringBootApplication上的注解SpringBootApplication SpringBootApplication public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class);} }注解SpringBootApplication的源码 Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Inherited SpringBootConfiguration EnableAutoConfiguration ComponentScan(excludeFilters {Filter(type FilterType.CUSTOM, classes TypeExcludeFilter.class),Filter(type FilterType.CUSTOM, classes AutoConfigurationExcludeFilter.class) }) public interface SpringBootApplication {/*** Exclude specific auto-configuration classes such that they will never be applied.* return the classes to exclude*/AliasFor(annotation EnableAutoConfiguration.class)Class?[] exclude() default {};... ... ...}其中有三个核心注解 SpringBootConfiguration等同与Configuration既标注该类是Spring的一个配置类EnableAutoConfigurationSpringBoot自动配置功能开启ComponentScan组件扫描默认扫描当前引导类所在包及其子包 按住Ctrl点击查看注解EnableAutoConfiguration Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Inherited AutoConfigurationPackage Import(AutoConfigurationImportSelector.class) public interface EnableAutoConfiguration {... ... ... }其中Import(AutoConfigurationImportSelector.class) 导入了AutoConfigurationImportSelector类 按住Ctrl点击查看AutoConfigurationImportSelector源码 public String[] selectImports(AnnotationMetadata annotationMetadata) {... ... ...ListString configurations getCandidateConfigurations(annotationMetadata,attributes);configurations removeDuplicates(configurations);SetString exclusions getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations filter(configurations, autoConfigurationMetadata);fireAutoConfigurationImportEvents(configurations, exclusions);return StringUtils.toStringArray(configurations); }protected ListString getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes) {ListString configurations SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());return configurations; }其中SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定类对应的类名称列表 该spring.factories文件格式为键值对键为自动配置类全类名值多个为该自动配置类所对应的配置类的全类名 这些配置类定义的Bean会根据条件注解所指定的条件判断是否将其注入到spring容器中条件判断注解举例 ConditionalOnClass类加载器中是否存在对应的类引入jar包一般就会有对应的类就会将该配置类 里面的bean注入到spring容器中ConditionalOnBean容器中是否存在对应的bean 4.SpringBoot的配置文件 4.1SpringBoot配置文件的类型及作用 4.1.1配置文件类型及作用 如果想使用自己的配置替换默认配置的话就可以使用application.properties或者application.ymlapplication.yaml进行配置。 SpringBoot默认会从Resources目录下加载application.properties或application.ymlapplication.yaml文件 其中application.properties文件是键值对类型的文件之前一直在使用所以此处不在对properties文件的格式进行阐述。除了properties文件外SpringBoot还可以使用yml文件进行配置下面对yml文件进行讲解。 4.1.2 application.properties # 数据库连接配置 spring.datasource.urljdbc:mysql://localhost:3306/mydatabase spring.datasource.usernameroot spring.datasource.password123456 spring.datasource.driver-class-namecom.mysql.jdbc.Driver4.1.3 application.yml或application.yaml # 数据库连接配置 spring:datasource:url: jdbc:mysql://localhost:3306/mydatabaseusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver4.1.4读取配置文件数据 application.yml person:name: zhangsanage: 18读取 Value(${person.name}) private String name; Value(${person.age}) private Integer age;4.2配置文件的加载顺序 4.2.1项目内配置文件加载顺序 1不同目录的配置文件的加载顺序 Springboot程序启动时会从以下位置加载配置文件优先级由高到底高优先级的配置会覆盖低优先级的配置没有的配置进行互补配置 优先级1项目路径下的config文件夹配置文件 优先级2项目的根目录下面配置文件 优先级3资源路径下的config文件夹配置文件 优先级4资源路径下配置文件2同一目录、不同后缀的配置文件加载顺序 当properties、yaml和yml三种文件路径相同时三个文件中的配置信息都会生效但是当三个文件中有配置信息冲突时加载顺序是 优先级低的配置会被先加载所以优先级高的配置会覆盖优先级低的配置。 properties最高 yml yaml(最低)验证 4.2.2外部配置文件 当我们把项目打包后如何在配置SpringBoot项目呢 1命令行参数 项目打包好以后我们可以使用命令行参数的形式来改变想改变的几个参数直接在启动命令后添加启动参数如果有多个配置项可以用空格分开。 java -jar springboot-configuration.jar --server.port8088 --server.servlet.context-path/spring2spirng.config.location 在第一种情况下如果参数数量过多我们就要考虑配置文件了我们在启动项目的时候可以用spring.config.location来指定配置文件的新位置。指定的配置文件和jar包中默认加载的配置文件共同起作用形成互补配置。 指定配置文件从F盘下读取 java -jar springboot-configuration.jar --spring.config.locationF:/application.properties4.3多环境配置 4.3.1多文件配置多个环境 环境区分 dev开发环境 test测试环境 prod生产环境线上 三个环境配置文件 application-dev.yml application-test.yml application-prod.yml 指定文件生效在application.yml指定 spring:profiles:active:dev4.3.2单个文件配置多个环境 不需要创建多个文件来区分了直接以 三个横杠 来当做一个配置文件环境。 以下案例就是分为了两个环境然后最上方active来指定对应的profiles环境 spring:profiles:active: prod--- server:port: 8083 spring:profiles: dev---server:port: 8084 spring:profiles: prod4.3.3补充命令行指定 java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.activedev5.SpringBoot整合其他技术 5.1SpringBoot整合Junit 5.1.1添加依赖 !--测试的起步依赖-- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope /dependency5.1.2编写测试类 RunWith(SpringRunner.class) SpringBootTest(classes MySpringBootApplication.class) public class MapperTest {Autowiredprivate UserMapper userMapper;Testpublic void test() {ListUser users userMapper.queryUserList();System.out.println(users);} }其中SpringRunner继承自SpringJUnit4ClassRunner使用哪一个Spring提供的测试测试引擎都可以 public final class SpringRunner extends SpringJUnit4ClassRunner SpringBootTest的属性指定的是引导类的字节码对象 5.1.3控制台 5.2SpringBoot整合Mybatis 5.2.1添加依赖 !--mybatis起步依赖-- dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion1.1.1/version /dependency5.2.2添加数据库驱动 !-- MySQL连接驱动 -- dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId /dependency5.2.3添加数据库连接 spring:datasource:url: jdbc:mysql://localhost:3306/mydatabaseusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver5.2.4创建user表 在test数据库中创建user表 -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(50) DEFAULT NULL,password varchar(50) DEFAULT NULL,name varchar(50) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT10 DEFAULT CHARSETutf8;-- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO user VALUES (1, zhangsan, 123, 张三); INSERT INTO user VALUES (2, lisi, 123, 李四);5.2.5创建实体Bean public class User {// 主键private Long id;// 用户名private String username;// 密码private String password;// 姓名private String name;//此处省略getter和setter方法 .. ..}5.2.6编写Mapper接口 Mapper public interface UserMapper {public ListUser queryUserList(); }5.2.7配置Mapper映射文件 ?xml version1.0 encodingutf-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.itheima.mapper.UserMapperselect idqueryUserList resultTypeuserselect * from user/select /mapper5.2.8在application.properties添加映射文件信息 #spring集成Mybatis环境 #pojo别名扫描包 mybatis.type-aliases-packagecom.itheima.domain #加载Mybatis映射文件 mybatis.mapper-locationsclasspath:mapper/*Mapper.xml5.2.9controller层 Controller public class MapperController {Autowiredprivate UserMapper userMapper;RequestMapping(/queryUser)ResponseBodypublic ListUser queryUser(){ListUser users userMapper.queryUserList();return users;}}5.2.10测试 5.3SpringBoot整合Redis 笔记链接【Redis | 第三篇】Springboot整合Redis 5.4SpringBoot整合Mybatis Plus 5.4.1导入依赖 !-- mybatisPlus 核心库 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.1.0/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency5.4.2yml配置 server:port: 10100 # 配置启动端口号mybatis:config-location: classpath:mybatis.cfg.xml # mybatis主配置文件所在路径type-aliases-package: com.demo.drools.entity # 定义所有操作类的别名所在包mapper-locations: # 所有的mapper映射文件- classpath:mapper/*.xmlspring: #springboot的配置datasource: #定义数据源#127.0.0.1为本机测试的ip3306是mysql的端口号。serverTimezone是定义时区照抄就好mysql高版本需要定义这些东西#useSSL也是某些高版本mysql需要问有没有用SSL连接url: jdbc:mysql://127.0.0.1:3306/test?serverTimezoneGMT%2B8useSSLFALSEusername: root #数据库用户名root为管理员password: 123456 #该数据库用户的密码# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# mybatis-plus相关配置 mybatis-plus:# xml扫描多个目录用逗号或者分号分隔告诉 Mapper 所对应的 XML 文件位置mapper-locations: classpath:mapper/*.xml# 以下配置均有默认值,可以不设置global-config:db-config:#主键类型 AUTO:数据库ID自增 INPUT:用户输入ID,ID_WORKER:全局唯一ID (数字类型唯一ID), UUID:全局唯一ID UUID;id-type: auto#字段策略 IGNORED:忽略判断 NOT_NULL:非 NULL 判断) NOT_EMPTY:非空判断field-strategy: NOT_EMPTY#数据库类型db-type: MYSQLconfiguration:# 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射map-underscore-to-camel-case: true# 如果查询结果中包含空值的列则 MyBatis 在映射的时候不会映射这个字段call-setters-on-nulls: true# 这个配置会将执行的sql打印出来在开发或测试的时候可以用log-impl: org.apache.ibatis.logging.stdout.StdOutImpl5.4.3用户信息实体 Data TableName(user_info)//TableName中的值对应着表名 public class UserInfoEntity {/*** 主键* TableId中可以决定主键的类型,不写会采取默认值,默认值可以在yml中配置* AUTO: 数据库ID自增* INPUT: 用户输入ID* ID_WORKER: 全局唯一IDLong类型的主键* ID_WORKER_STR: 字符串全局唯一ID* UUID: 全局唯一IDUUID类型的主键* NONE: 该类型为未设置主键类型*/TableId(type IdType.AUTO)private Long id;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 技能*/private String skill;/*** 评价*/private String evaluate;/*** 分数*/private Long fraction; }5.4.4配置类 public class MybatisPlusConfig {/*** mybatis-plus SQL执行效率插件【生产环境可以关闭】*/Beanpublic PerformanceInterceptor performanceInterceptor() {return new PerformanceInterceptor();}/*** 分页插件*/Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();} }5.4.5启动类 SpringBootApplication //MapperScan和dao层添加Mapper注解意思一样 MapperScan(basePackages com.demo.drools.dao) public class DroolsApplication {public static void main(String[] args) {SpringApplication.run(DroolsApplication.class, args);} }5.4.6Dao层 Mapper public interface UserInfoDao extends BaseMapperUserInfoEntity { }5.4.7Service层 public interface UserInfoService extends IServiceUserInfoEntity {}Service public class UserInfoSerivceImpl extends ServiceImplUserInfoDao, UserInfoEntity implements UserInfoService {}5.4.8扩展Mybatis Plus的核心 Mybatis Plus的核心为QueryWrapper、UpdateWrapper QueryWrapper Entity 对象封装操作UpdateWrapper Update 条件封装用于Entity对象更新操作条件构造器使用中的各个方法格式和说明 5.5SpringBoot整合RabbitMQ 笔记链接【RabbitMQ篇】Springboot整合RabbiMQ 6.SpringBoot实现拦截器 6.1拦截器介绍 拦截器(Interceptor)同 Filter 过滤器一样它俩都是面向切面编程——AOP 的具体实现AOP切面编程只是一种编程思想而已。 你可以使用 Interceptor 来执行某些任务例如在 Controller 处理请求之前编写日志添加或更新配置… 在 Spring中当请求发送到 Controller 时在被Controller处理之前它必须经过 Interceptors0或多个。 6.2拦截器作用 日志记录记录请求信息的日志以便进行信息监控、信息统计、计算 PVPage View等权限检查如登录检测进入处理器检测是否登录性能监控通过拦截器在进入处理器之前记录开始时间在处理完后记录结束时间从而得到该请求的处理时间。反向代理如 Apache 也可以自动记录通用行为读取 Cookie 得到用户信息并将用户对象放入请求从而方便后续流程使用还有如提取 Locale、Theme 信息等只要是多个处理器都需要的即可使用拦截器实现。 6.3自定义拦截器 如果你需要自定义 Interceptor 的话必须实现 org.springframework.web.servlet.HandlerInterceptor接口或继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter类并且需要重写下面下面 3 个方法 preHandler(HttpServletRequest request, HttpServletResponse response, Object handler) 方法在请求处理之前被调用。该方法在 Interceptor 类中最先执行用来进行一些前置初始化操作或是对当前请求做预处理也可以进行一些判断来决定请求是否要继续进行下去。该方法的返回至是 Boolean 类型当它返回 false 时表示请求结束后续的 Interceptor 和 Controller 都不会再执行当它返回为 true 时会继续调用下一个 Interceptor 的 preHandle 方法如果已经是最后一个 Interceptor 的时候就会调用当前请求的 Controller 方法。postHandler(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 方法在当前请求处理完成之后也就是 Controller 方法调用之后执行但是它会在 DispatcherServlet 进行视图返回渲染之前被调用所以我们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法需要在当前对应的 Interceptor 类的 postHandler 方法返回值为 true 时才会执行。顾名思义该方法将在整个请求结束之后也就是在 DispatcherServlet 渲染了对应的视图之后执行。此方法主要用来进行资源清理。 6.3.1LogInterceptor类 public class LogInterceptor extends HandlerInterceptorAdapter {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {long startTime System.currentTimeMillis();System.out.println(\n-------- LogInterception.preHandle --- );System.out.println(Request URL: request.getRequestURL());System.out.println(Start Time: System.currentTimeMillis());request.setAttribute(startTime, startTime);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(\n-------- LogInterception.postHandle --- );System.out.println(Request URL: request.getRequestURL());}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(\n-------- LogInterception.afterCompletion --- );long startTime (Long) request.getAttribute(startTime);long endTime System.currentTimeMillis();System.out.println(Request URL: request.getRequestURL());System.out.println(End Time: endTime);System.out.println(Time Taken: (endTime - startTime));} }6.3.2OldLoginInterceptor类 public class OldLoginInterceptor extends HandlerInterceptorAdapter {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(\n-------- OldLoginInterceptor.preHandle --- );System.out.println(Request URL: request.getRequestURL());System.out.println(Sorry! This URL is no longer used, Redirect to /admin/login);response.sendRedirect(request.getContextPath() /admin/login);return false;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(\n-------- OldLoginInterceptor.postHandle --- );}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(\n-------- OldLoginInterceptor.afterCompletion --- );} }6.3.3配置拦截器 Configuration public class WebConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LogInterceptor());registry.addInterceptor(new OldLoginInterceptor()).addPathPatterns(/admin/oldLogin);registry.addInterceptor(new AdminInterceptor()).addPathPatterns(/admin/*).excludePathPatterns(/admin/oldLogin);} }LogInterceptor 拦截器用于拦截所有请求 OldLoginInterceptor 用来拦截链接 “ / admin / oldLogin”它将重定向到新的 “ / admin / login”。AdminInterceptor用来拦截链接 “/admin/*”除了链接 “ / admin / oldLogin”。 6.4应用 6.4.1性能监控 如记录一下请求的处理时间得到一些慢请求如处理时间超过500毫秒从而进行性能改进一般的反向代理服务器如 apache 都具有这个功能但此处我们演示一下使用拦截器怎么实现。 实现分析 在进入处理器之前记录开始时间即在拦截器的 preHandle 记录开始时间在结束请求处理之后记录结束时间即在拦截器的 afterCompletion 记录结束实现并用结束时间-开始时间得到这次请求的处理时间 问题 我们的拦截器是单例因此不管用户请求多少次都只有一个拦截器实现即 线程不安全那我们应该怎么记录时间呢 解决方案是使用 ThreadLocal它是线程绑定的变量提供线程局部变量一个线程一个 ThreadLocalA线程的ThreadLocal 只能看到A线程的 ThreadLocal不能看到B线程的 ThreadLocal。 代码实现 public class StopWatchHandlerInterceptor extends HandlerInterceptorAdapter {private NamedThreadLocalLong startTimeThreadLocal new NamedThreadLocal(StopWatch-StartTime);private Logger logger LoggerFactory.getLogger(StopWatchHandlerInterceptor.class);Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {long beginTime System.currentTimeMillis();//1、开始时间startTimeThreadLocal.set(beginTime);//线程绑定变量该数据只有当前请求的线程可见return true;//继续流程}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {long endTime System.currentTimeMillis();//2、结束时间long beginTime startTimeThreadLocal.get();//得到线程绑定的局部变量开始时间long consumeTime endTime - beginTime;//3、消耗的时间if(consumeTime 500) {//此处认为处理时间超过500毫秒的请求为慢请求//TODO 记录到日志文件logger.info(String.format(%s consume %d millis, request.getRequestURI(), consumeTime));}//测试的时候由于请求时间未超过500所以启用该代码 // logger.info(String.format(%s consume %d millis, request.getRequestURI(), consumeTime));} }NamedThreadLocalSpring提供的一个命名的ThreadLocal实现。 在测试时需要把 stopWatchHandlerInterceptor 放在拦截器链的第一个这样得到的时间才是比较准确的。 拦截器配置类 Configuration public class WebConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new StopWatchHandlerInterceptor());registry.addInterceptor(new OldLoginInterceptor()).addPathPatterns(/admin/oldLogin);} }6.4.2登录检测 在访问某些资源时如订单页面需要用户登录后才能查看因此需要进行登录检测。 流程 访问需要登录的资源时由拦截器重定向到登录页面如果访问的是登录页面拦截器不应该拦截用户登录成功后往 cookie/session 添加登录成功的标识如用户编号下次请求时拦截器通过判断 cookie/session 中是否有该标识来决定继续流程还是到登录页面在此拦截器还应该允许游客访问的资源。 代码实现 public class MyInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {boolean flag true;String ip request.getRemoteAddr();long startTime System.currentTimeMillis();request.setAttribute(requestStartTime, startTime);if (handler instanceof ResourceHttpRequestHandler) {System.out.println(preHandle这是一个静态资源方法);} else if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod (HandlerMethod) handler;Method method handlerMethod.getMethod();System.out.println(用户: ip ,访问目标: method.getDeclaringClass().getName() . method.getName());}//如果用户未登录User user (User) request.getSession().getAttribute(user);if (null user) {//重定向到登录页面response.sendRedirect(toLogin);flag false;}return flag;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {if (handler instanceof ResourceHttpRequestHandler) {System.out.println(postHandle这是一个静态资源方法);} else if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod (HandlerMethod) handler;Method method handlerMethod.getMethod();long startTime (long) request.getAttribute(requestStartTime);long endTime System.currentTimeMillis();long executeTime endTime - startTime;int time 1000;//打印方法执行时间if (executeTime time) {System.out.println([ method.getDeclaringClass().getName() . method.getName() ] 执行耗时 : executeTime ms);} else {System.out.println([ method.getDeclaringClass().getSimpleName() . method.getName() ] 执行耗时 : executeTime ms);}}}}7.文件上传/下载 7.1文件上传/下载流程概述 7.1.1文件上传 当客户端发送文件上传请求时Spring Boot会接收到一个包含文件的MultipartHttpServletRequest对象。在控制器方法中可以通过参数接收这个MultipartHttpServletRequest对象并从中获取上传的文件。Spring Boot会将上传的文件存储到临时目录中可以通过MultipartFile对象的getOriginalFilename()方法获取文件名通过getBytes()方法获取文件内容。文件上传后可以将其保存到服务器的持久化存储中例如本地磁盘、云存储等。 7.1.2文件下载 当客户端发送文件下载请求时Spring Boot会根据请求的URL找到对应的文件。找到文件后需要将文件的内容写入到Response的输出流中为了防止浏览器解析需要在响应头中设置正确的MIME类型Content-Type。如果要实现断点续传功能需要根据文件的元数据信息判断是否已经下载过该文件如果已经下载过则直接返回已存在的文件内容即可。 7.2实现过程 7.2.1添加依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.4/version/dependency7.2.2配置文件上传大小限制 server:port: 18080spring:servlet:multipart:max-file-size: 10MBmax-request-size: 10MB7.2.3上传控制器 创建一个控制器类用于处理文件上传请求。在这个类中使用PostMapping注解指定处理POST请求的方法并使用RequestParam(file) MultipartFile file参数接收上传的文件。 // 创建文件上传控制器 RestController RequestMapping(/api/upload) public class FileUploadController { // 处理文件上传请求的POST方法 PostMapping(/) public ResponseEntityString handleFileUpload(RequestParam(file) MultipartFile file) { try { // 获取上传文件的文件名 String fileName file.getOriginalFilename(); // 将文件保存到磁盘或执行其他操作这里只是简单地将文件保存到静态资源目录下 file.transferTo(new File(D:/ fileName)); return new ResponseEntity(文件上传成功, HttpStatus.OK); } catch (Exception e) { return new ResponseEntity(文件上传失败 e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } }7.2.4下载控制器 创建一个控制器类用于处理文件下载请求。在这个类中我们将使用GetMapping注解指定处理GET请求的方法并使用RequestParam(“filename”) String fileName参数接收要下载的文件名。然后我们可以使用文件名来获取要下载的文件并将其作为响应返回给客户端。为了让Spring Boot能够找到静态资源如文件你需要在src/main/resources目录下创建一个名为static的文件夹并在其中创建一个名为files的文件夹用于存放要下载的文件。 RestController RequestMapping(/api/download) public class FileDownloadController {private static final Logger log LoggerFactory.getLogger(FileDownloadController.class);Autowiredprivate ResourceLoader resourceLoader;// 处理文件下载请求的GET方法通过文件名获取文件并返回给客户端下载GetMapping(/{filename:.})public ResponseEntityResource handleFileDownload(PathVariable String filename) throws IOException {// 获取要下载的文件的Resource对象这里假设文件保存在静态资源目录下的files文件夹中Resource resource resourceLoader.getResource(classpath:static/files/ filename);if (resource null) {return new ResponseEntity(HttpStatus.NOT_FOUND);}// 将文件内容包装为响应体并设置响应头信息提示浏览器下载文件而不是打开文件InputStreamResource inputStreamResource new InputStreamResource(resource.getInputStream());HttpHeaders headers new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, attachment; filename filename);return ResponseEntity.ok().headers(headers).contentType(MediaTypeFactory.getMediaType(resource).get()).body(inputStreamResource);} }8.SpringBoot访问静态资源 8.1何为静态资源 静态资源一般是网页端的HTML文件、JavaScript文件和图片。尤其是设置图片的静态资源尤其重要 8.2设置访问静态资源的两种方法 Springboot内设置静态资源或者说静态资源文件夹主要有两种方法均为SpringMVC实现 在application.yml/application.properties内配置。设置Configuration配置类。 以上两种方法均可实现用户访问网址不走Controller层的拦截直接进行静态文件访问。 8.2.1application设置方法 1配置详讲 spring.mvc.static-path-pattern根据官网的描述和实际效果可以理解为**静态文件URL匹配头**也就是静态文件的URL地址开头。Springboot默认为/**。 spring.web.resources.static-locations根据官网的描述和实际效果可以理解为实际静态文件地址也就是静态文件URL后匹配的实际静态文件。 Springboot默认为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/注意 spring.web.resources.static-locations是后续配置旧版Springboot的配置项为spring-resources-static-locations在2.2.5版本之后旧版本配置已经失效。spring.web.resources.static-locations有多个配置项在Springboot编译后会合并为一个文件。多个配置文件使用,进行分割。spring.web.resources.static-location仅仅允许一个配置无法使用,进行分割如果需要多个静态资源文件可以使用下文的配置类方法。spring.web.resources.static-locations可以使用classpath、file进行匹配。如果使用file这个时候的相对路径为项目地址打包为.jar后相对路径就是.jar运行地址。 2实践 最终效果 浏览器输入http://localhost:8088/SystemData/UserData/Avatar/Mintimate.jpeg 可以直接访问项目文件下的/SystemData/UserData/Avatar/Mintimate.jpeg 配置文件 spring:mvc:# URL响应地址Springboot默认为/**)static-path-pattern: /SystemData/**web:resources:# 静态文件地址保留官方内容后进行追加static-locations: classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,file:SystemData其中file:SystemData就是映射本地文件了。 3优缺点 优点简单粗暴缺点 URL响应地址只能为一项也就是spring.mvc.static-path-pattern配置只能写一项上文设置了/SystemData/**为URL匹配就不能设置第二个/resources/**这样的配置为第二静态目录如果需要设置多个地址为静态资源目录可以参考下文的设置配置类方法方法。 8.2.2设置配置类方法 1方法介绍 写一个配置类实现静态资源的文件夹方法很多。比如 继承于WebMvcConfigurationSupport父类并实现addResourceHandlers方法。 Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { }这里的registry使用链式编程,方法为 addResourceHandler添加URL响应地址目录。addResourceLocations添加实际资源目录。 引用WebMvcConfigurer接口并实现addInterceptors方法常用 一些文章可能会让你继承于WebMvcConfigurerAdapter方法但是实际上WebMvcConfigurerAdapter方法在Spring5.0和Springboot2.0之后已经弃用。 2实践 最终效果1 浏览器输入http://localhost:8088/SystemData/UserData/Avatar/Mintimate.jpeg可以直接访问项目文件下的/SystemData/UserData/Avatar/Mintimate.jpeg 最终效果2 浏览器输入http://localhost:8088/SystemDataTest/UserData/Avatar/Mintimate.jpeg可以直接访问项目文件下的/Test/UserData/Avatar/Demo.jpeg 添加一个配置类并继承WebMvcConfigurationSupport实现addResourceHandlers方法并打上Configuration注解使其成为配置类 Configuration public class WebConfig extends WebMvcConfigurationSupport{Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {//定位到项目文件夹下的SystemData文件夹static final String IMG_PATHSystem.getProperty(user.dir)/SystemData/;static final String IMG_PATH_TWOSystem.getProperty(user.dir)/Test/;registry.addResourceHandler(/SystemData/**)).addResourceLocations(file:IMG_PATH);registry.addResourceHandler(/SystemDataTest/**)).addResourceLocations(file:IMG_PATH_TWO);super.addResourceHandlers(registry);} }3优缺点 相比前文这样的配置更麻烦。相比前文这样的可塑性更高可以添加更多的映射、不会对默认配置造成覆盖等。
http://www.dnsts.com.cn/news/102018.html

相关文章:

  • 写建设网站的具体步骤广州的网站建设公司哪家好
  • 做网站是什么样的工作机加工接单什么平台好
  • 松江做网站的公司模板免费下载 素材
  • 网站色彩设计品牌网站建设d小蝌蚪
  • 网站建设密码网站建设企业哪家好
  • 手机网站开发 c郑州网站建设361
  • 网站后台设计培训学校美容 网站源码
  • ui设计作品欣赏网站北京软件开发公司滕迎江
  • 合肥做检查军大网站个人网站备案备注写什么
  • 自己公司怎么做网站图片网站模板下载
  • 阿里巴巴手工活加工平台网站优化工作安排
  • 云上网站做等保网页广告图
  • wordpress网站文章形式辽源市住房和城乡建设局网站
  • 360网站地图怎么做免费建立微信网站
  • 商城网站建设步骤大庆免费网站建设
  • 网站开发 科技东莞网站建设制作厂
  • 家具公司网站页面设计模板冒用公司名做网站
  • 网站模版是所有源代码精品课程网站建设
  • 外贸网站推广渠道网站网络资源建立
  • 如何做搜索引擎网站网页浏览器怎么卸载
  • 世界网站流量排名韶关网站制作
  • 做网站需要注册公司吗网站的主页按钮怎么做的
  • 网站通用样式青岛城市建设集团网站
  • 青岛高端网站设计公司做网站切片
  • 广州网站建设代理榆林市网站seo
  • 形容网站页面做的好的词语在长沙阳光医院做网站编辑
  • 北京网站建设公司服务有哪些网站底部固定广告代码
  • 做销售的什么网站好免费模板网站都有什么区别
  • 东莞建设企业网站公司关于门户网站建设的请示
  • 浙江网站建设工作室唐山百度搜索排名优化