zoukankan      html  css  js  c++  java
  • SpringBoot学习

    SpringBoot学习

    SpringBoot官网文档路径:

    https://docs.spring.io/spring-boot/docs/2.0.0.RC1/reference/htmlsingle/#using-boot-devtools-property-defaults

    一、创建第一个SpringBoot

    1、创建一个maven项目

    (1)File—>New—>Project(建议使用jdk1.8或以上)

    (2)点击Next

    (3)输入GroupId和ArtifactId后,点击Next

    (4)点击Finish即可成功创建maven项目

    2、配置pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.example</groupId>
        <artifactId>SpringBootDemo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--继承默认值为Spring Boot -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.0.RC1</version>
        </parent>
    
        <!-- 添加Web应用程序的典型依赖项  -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
        <!-- 打包为可执行jar -->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <!-- 添加Spring存储库 -->
        <!-- (如果使用的是.RELEASE版本,则不需要这样) -->
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <url>http://repo.spring.io/snapshot</url>
                <snapshots><enabled>true</enabled></snapshots>
            </repository>
            <repository>
                <id>spring-milestones</id>
                <url>http://repo.spring.io/milestone</url>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-snapshots</id>
                <url>http://repo.spring.io/snapshot</url>
            </pluginRepository>
            <pluginRepository>
                <id>spring-milestones</id>
                <url>http://repo.spring.io/milestone</url>
            </pluginRepository>
        </pluginRepositories>
    </project>

    3、在 src/main/java目录下新建Example.java文件

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @EnableAutoConfiguration
    public class Example {
    
        @RequestMapping("/")
        String home() {
            return "Hello World!";
        }
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(Example.class, args);
        }
    
    }

    4、运行main方法

    5、浏览器中访问:http://localhost:8080/

    6、项目中一般是以jar方式部署

    (1)生成jar包

    (2)以jar包部署方式(打开cmd)

    a.默认日志级别INFO,命令:java -jar SpringBootDemo-1.0-SNAPSHOT.jar

    b.关闭应用程序,ctrl+C

    c.启动时可以设置日志级别为debug 命令:java -jar SpringBootDemo-1.0-SNAPSHOT.jar --debug

    d.常见错误,端口冲突,需要检查一下是否其他地方都使用一样的端口

    二、SpringBoot常用注解说明

    1、@Controller 处理Http请求

    2、@RestController Spring框架4版本之后出来的注解,之前版本返回json数据需要@ResponseBody配合@Controller

    代码一和代码二的效果一致:

    代码一:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @EnableAutoConfiguration
    public class Example {
    
        @RequestMapping("/")
        @ResponseBody
        String home() {
            return "Hello World!";
        }
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(Example.class, args);
        }
    
    }

    代码二:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @EnableAutoConfiguration
    public class Example {
    
        @RequestMapping("/")
        String home() {
            return "Hello World!";
        }
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(Example.class, args);
        }
    
    }

    3、@RequestMapping 配置url映射关系

    4、@PathVariable 获取url中的数据

    (1)定义URL变量规则:可以在@RequestMapping注解中用{}来表明它的变量部分,例如:

    @RequestMapping("/users/{username}")

    这里{username}就是我们定义的变量规则,username是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理:

    • /users/tianmaying
    • /users/ricky
    • users/tmy1234

    需要注意的是,在默认情况下,变量中不可以包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即使你认为tianmaying/ricky是一个存在的用户名。

    @RequestMapping("/users/{username}")
    public String userProfile(@PathVariable String username){
        return "user:" + username;
    }

    (2)当@Controller处理HTTP请求时,userProfile的参数username会自动设置为URL中对应变量username(同名赋值)的值

    在默认的情况下,Spring会对@PathVariable注解的变量进行自动赋值,当然你也可以指定@PathVariable使用哪一个URL中的变量:

    @RequestMapping("/users/{name}")
    public String userProfile(@PathVariable("name") String username){
        return "user:" + username;
    }

    (3)定义多个URL变量

    @PathVariable注解的参数可以是一些基本的简单类型:int,long,Date,String等,Spring能根据URL变量的具体值以及函数参数的类型来进行转换,例如/user/testUserName/intParam/5,会将“testUserName”的值赋给username,而5赋值给int变量num。

    @RequestMapping("/user/{username}/intParam/{num}")
    public String getUserInfo(@PathVariable String username , @PathVariable int num){
        return "user: " + username + ";intParam:" + num;
    }

    (4)匹配正则表达式

    除了简单地定义{username}变量,还可以定义正则表达式进行更精确的控制,定义语法是{变量名:正则表达式}[a-zA-Z0-9_]+是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404Not Found。

    5、@RequestParam 获取请求参数的值

    @RequestMapping("/user/test")
    public String getUserName1(@RequestParam("userName") String userName) {
        return "userName = " + userName;
    }

     一旦我们在方法中定义了@RequestParam变量,如果访问的URL中不带有相应的参数,就会抛出异常——这是显然的,Spring尝试帮我们进行绑定,然而没有成功。

    但有的时候,参数确实不一定永远都存在,这是我们可以通过定义required属性:

    @RequestMapping("/user/test")
    public String getUserName1(@RequestParam(name="userName",required = false) String userName) {
        return "userName = " + userName;
    }

    当然,在参数不存在的情况下,可能希望变量有一个默认值:

    @RequestMapping("/user/test")
    public String getUserName1(@RequestParam(name = "userName" , required = false , defaultValue="admin") String userName) {
        return "userName = " + userName;
    }

    6、@GetMapping、@PostMapping组合注解

    (1)@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到 特定的处理方法上。

    即可以使用@GetMapping(value = “/hello”)来代替@RequestMapping(value=”/hello”,method= RequestMethod.GET)。即可以让我们精简代码。

    @GetMapping(value = "/helloGet")
    public String helloGet() {
        return "helloGet";
    }
    
    @RequestMapping(value = "/helloGet1",method= RequestMethod.GET)
    public String helloGet1() {
        return "helloGet1";
    }

     

    (2)@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。该注解将HTTP Post 映射到 特定的处理方法上。

    即可以使用@PostMapping(value = “/hello”)来代替@RequestMapping(value=”/hello”,method= RequestMethod.POST)。即可以让我们精简代码。

    @PostMapping(value = "/helloPost")
    public String helloPost() {
        return "helloPost";
    }
    
    @RequestMapping(value = "/helloPost1",method= RequestMethod.POST)
    public String helloPost1() {
        return "helloPost1";
    }

    三、自定义Banner

    1、在SpringBoot 启动的时候,首先在命令行上会打印出如下的信息:

    这就是 SpringBoot 的默认 banner。这个 启动 banner 是可以进行定制的。

    2、自定义Banner

    (1)第一种定制 SpringBoot 的方式是编辑一个banner.txt 文件,然后在里面输入要在 banner 里面显示的内容,最后把这个文件存放到 resource 目录下。

    生成banner.txt网页地址:https://www.bootschool.net/ascii

    点击下载bannner.txt文件按钮,最后把这个文件存放到 resource 目录下,启动SpringBoot项目:

    (2)图片Banner定制,图片的banner支持gif、png、jpef格式的图片。使用时,选用合适的图片,然后将图片名字改成banner,和文字的banner.txt文件一样,放到resource目录下即可 

    (3)如果在resource目录下既有 banner.txt 文件,又有 banner 的图片文件,SpringBoot 会先显示图片 banner ,然后再显示文本的 banner。

    四、自定义SpringApplication

    1、如果默认的 SpringApplication 不符合你的口味,你可以创建一个本地实例并对它进行自定义。例如,想要关闭banner你可以这样写:

    public static void main(String[] args) throws Exception {
        SpringApplication app = new SpringApplication(Example.class);
        app.setBannerMode(Banner.Mode.OFF);
        app.run(args);
    }

    这样的banner的内容项目启动的时候就不会输出:

     

    五、Application事件和监听器

    应用运行时,事件会以下面的次序发送:
    1、在运行开始,但除了监听器注册和初始化以外的任何处理之前,会发送一个 ApplicationStartedEvent 。
    2、在Environment将被用于已知的上下文,但在上下文被创建前,会发送一个 ApplicationEnvironmentPreparedEvent 。
    3、在refresh开始前,但在bean定义已被加载后,会发送一个 ApplicationPreparedEvent 。
    4、在refresh之后,相关的回调处理完,会发送一个 ApplicationReadyEvent ,表示应用准备好接收请求了。
    5、启动过程中如果出现异常,会发送一个 ApplicationFailedEvent 。

    public static void main(String[] args) throws Exception {
        SpringApplication application = new SpringApplication(Example.class);
        application.setBannerMode(Banner.Mode.OFF);
        application.addListeners(new MyListennerByAddedToApplication());
        application.run(args);
    }

    监听器

    import org.springframework.boot.context.event.*;
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.ApplicationListener;
    
    /**
     * Created by minstone on 2019/3/5.
     */
    public class MyListennerByAddedToApplication implements ApplicationListener<ApplicationEvent> {
    
        @Override
        public void onApplicationEvent(ApplicationEvent arg0) {
            // TODO Auto-generated method stub
            if(arg0.getClass().isAssignableFrom(ApplicationStartingEvent.class)){
    
                System.out.println(this.getClass()+"——ApplicationStartingEvent hapends");
            }else if(arg0.getClass().isAssignableFrom(ApplicationEnvironmentPreparedEvent.class)){
    
                System.out.println(this.getClass()+"——在Environment将被用于已知的上下文,但在上下文被创建前,ApplicationEnvironmentPreparedEvent hapends");
            }else if(arg0.getClass().isAssignableFrom(ApplicationPreparedEvent.class)){
    
                System.out.println(this.getClass()+"——在refresh开始前,但在bean定义已被加载后,ApplicationPreparedEvent hapends");
            }else if(arg0.getClass().isAssignableFrom(ApplicationStartedEvent.class)){
    
                System.out.println(this.getClass()+"——在运行开始,但除了监听器注册和初始化以外的任何处理之前,ApplicationStartedEvent hapends");
            }else if(arg0.getClass().isAssignableFrom(ApplicationReadyEvent.class)){
    
                System.out.println(this.getClass()+"——在refresh之后,相关的回调处理完,表示应用准备好接收请求了。ApplicationReadyEvent hapends");
            }else if(arg0.getClass().isAssignableFrom(ApplicationFailedEvent.class)){
    
                System.err.println(this.getClass()+"——启动过程中如果出现异常, ApplicationFailedEvent happends");
            }
        }
    }

    运行结果:

  • 相关阅读:
    SQL语法结构
    MVC ViewBag不能使用在工程文件中添加引用
    Structs2+spring+hibernate整合
    java解析多层嵌套json字符串
    [转载] javamail腾讯企业邮箱发送邮件
    【转载】java加载properties文件的六种方法总结
    Linux上执行java文件——用Eclipse将Java源代码生成可执行文件
    ssm框架实现用户登录的拦截器和过滤器
    Sql Server设置用户只能查看并访问特定数据库
    Java操作Excel之POI:excel导出文件
  • 原文地址:https://www.cnblogs.com/xuegu/p/10450747.html
Copyright © 2011-2022 走看看