SpringBoot入门

SpringBoot

SpringBoot简介(入门容易精通难)

SpringBoot来简化Spring应用开发,约定优于配置,去繁从简,just run就能创建一个独立的,产品级别的应用

产生背景

J2EE笨重的开发,繁多的配置,低下的开发效率,复杂的附属流程,第三方技术集成难度大

解决

Spring全家桶时代

SpringBoot→ J2EE一站式解决方案

SpringCloud→分布式整体解决方案

优点

快速创建独立运行的Spring项目以及与主流框架集成

使用嵌入式的Servlet容器,应用无需打成War包

starters自动依赖与版本控制

大量的自动配置,简化开发,也可修改默认值

无需配置xml,无代码生成,开箱即用

准生产环境的运行时应用监控

与云计算的天然集成

微服务

微服务:架构风格(服务微化)

一个应用应该是一组小型服务:可以通过HTTP的方式互通

每一个功能元素最终都是一个可独立替换和独立升级的软件单元;

环境搭建

jdk1.7及以上

maven3.3以上

idea

SpringBoot 1.5.9 RELEASE

SpringBoot简化配置

不需要手动导入依赖且不用写版本号

帮我们导入了web模块正常运行所需要的依赖

@SpringBootApplication:标注在某个类说明这个类是SpringBoot的主配置类,一般创建SpringBoot项目时会自动创建启动类并加上此注解

启动类最好放在JAVA目录下以免报错

idea使用Spring Initializer创建Spring Boot项目

使用aliyun镜像快速创建

http://start.aliyun.com

一般选择SpringWeb模块

如果需要省略get/set方法可以添加lombok模块

resource目录结构

static:保存所有的静态资源:js,css,images

templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面)

application.properties:Spring Boot应用的配置文件,可以修改一些默认配置

配置文件

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

application.properties

application.yml

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

YAML(YAML Ain’t Markup Language)

​ YAML A Markup Language:是一个标记语言

​ YAML Ain’t Markup Language:不是一个标记语言

标记语言:

​ 以前的配置文件:大多使用的是xxxx.xml文件

​ YAML:以数据为中心,比json,xml等更适合做配置文件

YAML例子:

server:
  port: 9004

xml:

<server>
	<port>9004</port>
</server>

YAML基本语法

k:(空格)v : 表示一对键值对(空格必须有);

以空格的缩进来控制层级关系;只要是左对齐的一对数据,都是同一层级的

server:
	port: 8081
	path: /hello

属性和值也是大小写敏感

字面量:普通的值(数字,字符串,布尔)

​ k: v :字面直接写

​ 字符串默认不用加双引号或者单引号

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

​ name: “zhangsan \n lisi”:输出:zhangsan 换行 lisi

​ ‘’:单引号;会转义特殊字符;特殊字符最终只是一个普通的字符串数据

​ name: ‘zhangsan \n lisi’:输出:zhangsan \n lisi

对象、Map(属性和值) (键值对):

​ k: v :在下一行写对象的属性和值的关系;注意缩进

​ 对象还是k: v的方式

friends:

​	lastName: zhangsan

​	age: 20

行内写法:

friends: {lastName: zhangsan,age: 18}

数组(List,Set):

​ 用- 值表示数组中的一个元素

pets:
	- cat
	- psig
	- dog

行内写法

pets: {cat,dog,pig}

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

@PropertySource(value = {“classpath:xxx.properties”})

@ImportResource:导入Spring的配置文件,让配置文件的内容生效

@ImportResource(locations = {“classpath:xxx.xml”})

@Configuration:告诉SpringBoot这是一个配置类,替代之前的配置文件

SpringBoot推荐使用全注解的方式给容器中添加组件

使用@Bean给容器中添加组件

自动配置原理

  1. SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

精髓:

  1. SpringBoot启动的时候会加载大量自动配置类
  2. 看我们需要的功能有没有SpringBoot默认写好的自动配置类
  3. 再来看这个自动配置类中到底配置了哪些组件,如果有,则无需再配
  4. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的

xxxxAutoConfiguration:自动配置类

给容器中添加组件

xxxxProperties:封装配置文件中相关属性

@Conditional派生注解(Spring注解版原生的@Conditional作用)

作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置类里面的所有内容才生效

@Conditional扩展注解:

​ @ConditionalOnJava:系统的Java版本是否符合要求

​ @ConditionalOnBean:容器中存在指定Bean

​ @ConditionalOnMissingBean:容器中不存在指定Bean

​ @ConditionalOnExpression:满足SPEL表达式

​ @ConditionalOnClass:系统中有指定类

​ @ConditionalOnMissingClass:系统中没有指定类

​ @ConditionalOnSingleCandidate:容器中只有一个指定的Bean,或者这个Bean是首选Bean

​ @ConditionalOnPreperty:系统中指定的属性是否有指定的值

​ @ConditionalOnResource:类路径下是否存在指定资源文件

​ @ConditionalOnWebApplication:当前是Web环境

​ @ConditionalOnNotWebApplication:当前不是Web环境

​ @ConditionalOnJndi:JNDI存在指定项

自动配置类只有在一定条件下才能生效

可以在配置文件中加入

debug= true

作用:开启SpringBoot的debug模式,可以在控制台中看到启用的自动配置类信息

SpringBoot与日志

​ SpringBoot底层是Spring,Spring默认选择的日志框架为JCL(Jakarta Commons Logging)

​ SpringBoot选用SLF4j和logback

Web开发

  1. 创建SpringBoot应用,选中我们需要的模块
  2. SpringBoot默认将这些模块配置好了,我们只需要在配置文件中指定少量配置就可以运行起来
  3. 编写业务代码
SpringBoot对静态资源的映射规则:

​ 在pom文件中引入jquery依赖

<!--引入jquery-webjar-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>

所有/webjars/**,都去classpath:/META-INF/resources/webjars/找资源

webjars:以jar包的方式引入静态资源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5DfTY4iA-1598497337652)(D:\Study-File\File\images\QQ图片20200824001011.png)]

”/**“访问当前项目的任何资源(静态资源的文件夹)

"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径

localhost:8080/abc 去静态资源文件夹里面找abc

欢迎页:静态资源文件夹下的所有index.html页面;被"/**"映射

localhost:8080/ 找index页面

所有的**/favicon.ico都是在静态资源文件夹下找

templates下放动态资源

动态页面需要先请求服务器,访问后台应用程序,然后再转向到页面,比如访问JSP。spring boot建议不要使用JSP,默认使用Thymeleaf模板引擎来做动态页面。

  1. 现在pom中要添加Thymeleaf组件

    <!--pom中添加thymleaf模板引擎功能场景-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    
  2. 引入thymeleaf组件后, 动态跳转找的是 templates目录下的文件, 如果存在相同的文件, 优先访问的是templates下的文件.

    SpringMVC扩展

    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
    
        /**
         * 视图跳转  映射
         * @param registry
         */
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("test");
        }
         /**
         * 配置拦截器
         * @param registry
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new MyInterrceptor())
                    .addPathPatterns("/**")
                    .excludePathPatterns("/index.html","/sayName")
                    .excludePathPatterns("/returnBigData")
            ;
        }
    }
    
    1.preHandle
    
    调用时间:Controller方法处理之前
    
    执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
    
    若返回false,则中断执行,注意:不会进入afterCompletion
    
     
    
    2.postHandle
    
    调用前提:preHandle返回true
    
    调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
    
    执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
    
    备注:postHandle虽然post打头,但post、get方法都能处理
    
     
    
    3.afterCompletion
    
    调用前提:preHandle返回true
    
    调用时间:DispatcherServlet进行视图的渲染之后
    
    多用于清理资源
    
    * 描述: 自定义拦截器, 只针对被拦截的请求,被放行的请求不会触发
    public class MyInterrceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return false;
        }
    }
    

SpringBoot定时任务

1.启动类添加注解 @EnableScheduling 开启对定时任务的支持

@SpringBootApplication
@EnableScheduling
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

2.定义组件

@Component
@Slf4j
public class SchedulerTask {

    private int count = 0;

    @Scheduled(cron = "*/6 * * * * ?")
    private void process() {
        log.info("this is scheduler task running" + (count ++ ));
    }

}
@Component
@Slf4j
public class SchedulerTask2 {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 6000)
    public void reportCurrentTime() {
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }


}

3.执行时间的配置

在上面的定时任务中,我们在方法上使用@Scheduled注解来设置任务的执行时间,并且使用三种属性配置方式:

  • fixedRate:定义一个按一定频率执行的定时任务
  • fixedDelay:定义一个按一定频率执行的定时任务,与上面不同的是,改属性可以配合initialDelay, 定义该任务延迟执行时间。
  • cron:通过表达式来配置任务执行时间

SpringBoot整合Swagger

前后端分离后,维护接口文档基本上是必不可少的工作。一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了。当然这是一种非常理想的状态,实际开发中却很少遇到这样的情况,接口总是在不断的变化之中,有变化就要去维护,做过的小伙伴都知道这件事有多么头大!还好,有一些工具可以减轻我们的工作量,Swagger2就是其中之一。1.引入依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

2.开启Swagger2

 @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.nvn.controller"))
                .paths(PathSelectors.any())
                .build().apiInfo(new ApiInfoBuilder()
                        .title("SpringBoot整合Swagger")
                        .description("SpringBoot整合Swagger,详细信息......")
                        .version("9.0")
                        .contact(new Contact("啊啊啊啊","blog.csdn.net","aaa@gmail.com"))
                        .license("The Apache License")
                        .licenseUrl("http://www.baidu.com")
                        .build());
    }

http://localhost:8080/swagger-ui.html

参数解释:

  1. @Api注解可以用来标记当前Controller的功能。

  2. @ApiOperation注解用来标记一个方法的作用。

  3. @ApiImplicitParam注解用来描述一个参数,可以配置参数的中文含义,也可以给参数设置默认值,这样在接口测试的时候可以避免手动输入。

  4. 如果有多个参数,则需要使用多个@ApiImplicitParam注解来描述,多个@ApiImplicitParam注解需要放在一个@ApiImplicitParams注解中。

  5. 需要注意的是,@ApiImplicitParam注解中虽然可以指定参数是必填的,但是却不能代替@RequestParam(required = true),前者的必填只是在Swagger2框架内必填,抛弃了Swagger2,这个限制就没用了,所以假如开发者需要指定一个参数必填,@RequestParam(required = true)注解还是不能省略。

  6. 如果参数是一个对象(例如上文的更新接口),对于参数的描述也可以放在实体类中。例如下面一段代码:

    @ApiModel
    public class User {
        @ApiModelProperty(value = "用户id")
        private Integer id;
        @ApiModelProperty(value = "用户名")
        private String username;
        @ApiModelProperty(value = "用户地址")
        private String address;
        //getter/setter
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值