zoukankan      html  css  js  c++  java
  • 【spring boot】SpringBoot初学(1)

    前言

      此文只是记录自己简单学习spring boot的笔记。所以,文章很多只是初步理解,可能存在严重错误。

    一、Spring boot的初步理解

      1、spring boot的目标 (摘自:spring-boot参考指南 official 中文

    • 为所有的Spring开发提供一个从根本上更快的和广泛使用的入门经验。
    • 开箱即用,但你可以通过不采用默认设置来摆脱这种方式。
    • 提供一系列大型项目常用的非功能性特征(比如,内嵌服务器,安全,指标,健康检测,外部化配置)。
    • 绝对不需要代码生成及XML配置。

      2、spring boot代替了什么,Spring、SpringMVC/Struts2、hibernate/Mybatis?

        个人理解:代替了spring。用代替/取代来解释貌似都不好,更准确的可能是封装了spring,使搭建SSH/SSM更快捷。

        传统的spring有很多xml配置,例如:dataSource、transactionManager、AOP、bean等等xml的配置。即便用注解,也要在xml中配置component-scan等。

        但在spring boot,遵循“约定大于配置”,所以尽可能的避免了xml配置。

      3、spring boot避免了哪些xml?

        主要是spring的application.xml、context等xml。但例如:mybatis.xml、log4j.xml等还是要的。

      4、什么是Starter POMs?

        Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合。你可以获取所有Spring及相关技术的一站式服务,

      而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符。例如,如果你想使用Spring和JPA进行数据库访问,

      只需要在你的项目中包含 spring-boot-starter-data-jpa 依赖,然后你就可以开始了。

      参考参考指南13.4,pdf页数56/420。

    二、Sping boot的建议

      1、推荐使用jdk1.8+。(虽然可以在1.6-1.7中使用)

      2、servlet容器。

    image

      3、Spring Boot兼容Apache Maven 3.2或更高版本;

           Spring Boot兼容Gradle 1.12或更高版本。

      4、建议使用thymeleaf、velocity、beetl等模版引擎。而不建议使用jsp(虽然可以配置jsp支持)。

    三、demo

      1、代码结构(idea)

    image

      2、解释

        application.java:入口

        GreetingController.java:controller层代码。

        index.html:默认首页。localhost:8080访问的页面即index.html。

        greeting.html:请求页面。

        (1、为什么html是在resources中。2、为什么结构是static、templates。3、如何修改此“约定”,把html放到webapp/WEB-INF下。

      这些问题在以后学习,此文不讨论。)

      3、source code

    <?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>VergiLyn</groupId>
        <artifactId>Spring boot</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.3.RELEASE</version>
        </parent>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <!-- 模版框架thymeleaf -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
            <!-- spring boot 单元测试依赖 BEGIN-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- spring boot 单元测试依赖 END-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    pom.xml
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    @Controller
    //@RestController
    public class GreetingController {
        @RequestMapping("/greeting")
        public String greeting(@RequestParam(value="name", required=false, defaultValue="VergiLyn") String name
                , Model model) {
            model.addAttribute("name", name);
            return "greeting";
        }
    
    }

    index.html

    <!DOCTYPE HTML>
    <html>
    <head>
        <title>Getting Started: Serving Web Content</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
    <p>Get your greeting <a href="/greeting">here</a></p>
    </body>
    </html>

    greeting.xml

    <!DOCTYPE HTML>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Getting Started: Serving Web Content</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
    <p th:text="'Hello, ' + ${name} + '!'" />
    </body>
    </html>

    spring boot的单元测试模版

    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    public class TestOfficialDemo {
    
        @LocalServerPort
        private int port;
    
        @Autowired
        private TestRestTemplate restTemplate;
    
        @Test
        public void testGreetingDefault() throws Exception {
            assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/greeting",String.class))
                    .contains("VergiLyn");
        }
    }

    4、测试

      运行application.java的main()方法,控制台打印:

    image

    请求访问localhost:8080

    image

    点击超链接“here”:可以看到用的是defaultValue。

    image

    自定义请求greeting:localhost:8080/greeting?name=VergiLyn淡无欲

    image

    四、部分解释

      1、@Controller、@RestController、@RequestMapping、@RequestParam是spring的注解,而非spring boot提供的注解。

      2、@Controller与@RestController的区别

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Controller {
        String value() default "";
    }
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Controller
    @ResponseBody
    public @interface RestController {
    	String value() default "";
    }

      通过sourceCode的定义可以看出:@RestController在@Controller的基础上多了@ResponseBody。简单理解就是:@RestController不能返回html、jsp。

      (Rest即webservice中RESTful的rest,可以理解成@RestController主要用来返回json等数据,而非页面)

      3、@SpringBootApplication

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(
        excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}
     )}
    )
    public @interface SpringBootApplication {
        Class<?>[] exclude() default {};
    
        String[] excludeName() default {};
    
        @AliasFor(
            annotation = ComponentScan.class,
            attribute = "basePackages"
        )
        String[] scanBasePackages() default {};
    
        @AliasFor(
            annotation = ComponentScan.class,
            attribute = "basePackageClasses"
        )
        Class<?>[] scanBasePackageClasses() default {};
    }

    摘自:参考指南

      很多Spring Boot开发者总是使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 注解他们的main类。由于这些
    注解被如此频繁地一块使用(特别是你遵循以上最佳实践时),Spring Boot提供一个方便的 @SpringBootApplication 选择。
      该 @SpringBootApplication 注解等价于以默认属性使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 。

    附录

      玩转spring boot——快速开始

      Serving Web Content with Spring MVC (官方demo)

      spring-boot参考指南 official 中文

  • 相关阅读:
    HashMap按键排序和按值排序
    LeetCode 91. Decode Ways
    LeetCode 459. Repeated Substring Pattern
    JVM
    LeetCode 385. Mini Parse
    LeetCode 319. Bulb Switcher
    LeetCode 343. Integer Break
    LeetCode 397. Integer Replacement
    LeetCode 3. Longest Substring Without Repeating Characters
    linux-网络数据包抓取-tcpdump
  • 原文地址:https://www.cnblogs.com/VergiLyn/p/6261145.html
Copyright © 2011-2022 走看看