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 中文

  • 相关阅读:
    video 标签在微信浏览器的问题解决方法
    微信朋友圈分享之自定义网页按钮分享
    巧用weui.topTips验证数据
    巧用weui.gallery(),点击图片后预览图片
    巧用ajax请求服务器加载数据列表时提示loading
    页面间固定参数,通过cookie传值
    手机端页面下拉加载数据的笨办法--点击按钮添加数据
    LeetCode 41 First Missing Positive(找到数组中第一个丢失的正数)
    LeetCode 40 Combination Sum II(数组中求和等于target的所有组合)
    LeetCode 39 Combination Sum(满足求和等于target的所有组合)
  • 原文地址:https://www.cnblogs.com/VergiLyn/p/6261145.html
Copyright © 2011-2022 走看看