zoukankan      html  css  js  c++  java
  • SpringBoot入门学习看这一篇就够了

    1.SpringBoot是什么?
    SpringBoot是一套基于Spring框架的微服务框架。
    2.为什么需要SpringBoot
    由于Spring是一个轻量级的企业开发框架,主要的功能就是用于整合和管理其他框架。但随着整合的框架越来越多,Spring的整合配置也日益繁琐。在这个情况下,Spring团队有了一个想法:就是将平时主流的、经常使用到的框架的整合配置预先写好,然后通过简单的几个参数就可以实现框架的快速整合。这个想法催生SpringBoot框架,它是实现了各种主流框架与Spring的自动整合的框架。
     
    3.SpringBoot的特点
    1.实现了各种主流的框架的快速整合
    2.实现了Spring的应用的快速部署,使用Spring Boot的Web应用可以以Jar的方式部署。(实现原理是将tomcat服务器打包到我们的web应用里面。)
     
    4.参考资料
    1.Spring官方的示例代码,地址如下:
    https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples
    2.SpringBoot官方参考文档,地址如下:
    https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#getting-started
     
    3.Spring Boot建议使用Eclipse安装STS插件或者直接使用STS开发工具。
     
    5.SpringBoot入门
    5.1 简单入门配置
    第一步:
    到SpringBoot官网https://start.spring.io生成maven项目下载并解压到Eclipse的工作空间导入到Eclipse中
    第二步:编写一个简单的Java类
    package com.gjs.springBoot.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    //启动自动配置,表示程序使用Springboot默认的配置
    public class HelloController {
        
        /**
         * 如果访问路径/,在页面输入字符串Hello World!
         */
         @RequestMapping("/")
         @ResponseBody
         public String home() {
             return "Hello World!";
         }
         
         public static void main(String[] args) {
            SpringApplication.run(HelloController.class, args);
        }
    }
    第三步:启动SpringBoot程序
    装了STS插件可以直接右击运行
    0
     
    没有装STS插件只能通过Maven运行
    0
     
    0
     
     
    5.2 使用@SpringBootApplication注解配置
    上面的示例有一个问题,就是每有一个Controller就需要配置一次
    SpringApplication.run(HelloController.class, args);
    使用@SpringBootApplication注解来配置就能解决这个问题
    在入口类(有main方法的类,一般为xxxApplication)使用@SpringBootApplication注解,启动项目时,SpringBoot框架会扫描加了@SpringBootApplication注解的入口类的同级目录和子目录的组件类的对象到Spring容器。
    0
     
    package com.gjs.springBoot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication    //等同于@EnableAutoConfiguration+@ComponentScan+@Configuration
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    5.3热启动
    使用spring-boot:run命令启动项目,每次修改完成代码都要重新启动。是非常麻烦的。
    我们就有那么一个想法,能不能修改完代码,程序不用重启直接自动编译了?
    我们将修改完代码开发工具自动编译的过程称为,热启动。Spring boot是支持热启动的。只有加入以下依赖就可以
    <dependency>  
           <groupId>org.springframework.boot</groupId>  
           <artifactId>spring-boot-devtools</artifactId>  
           <!--
               optional=true,依赖不会传递,该项目依赖devtools;
               之后依赖该项目的项目如果想要使用devtools,需要重新引入
           -->
           <optional>true</optional>  
    </dependency>
    6.SpringBoot常见基础包说明
    1.spring-boot-starter-web-1.5.4.RELEASE.jar:仅仅存放web项目需要的jar包的pom.xml
    2.spring-boot-starter-1.5.4.RELEASE.jar:仅仅存放springboot最小核心需要的jar包的pom.xml
    3.spring-boot-starter-logging-1.5.4.RELEASE.jar:仅仅存放日志输出需要的jar包的pom.xml
    4.spring-boot-1.5.4.RELEASE.jar:springboot框架核心包
    5.spring-boot-autoconfigure-1.5.4.RELEASE.jar:默认支持的自动配置的框架的配置包(重点)
    重点是spring-boot-autoconfigure包,因为spring boot的所有内置的自动配置的类都在里面!
     
    7.常用API说明
    7.1 SpringApplication类
    用于启动Spring Boot的程序,根据传入的类声明的注解来决定不同的启动方式。
    如:
    SpringApplication.run(Application.class, args);
    7.2 @EnableAutoConfiguration注解
    @EnableAutoConfiguration注解的作用是:启动程序时,告诉SpringApplication启动对象使用SpringBoot的默认配置。
    只要在SpringBoot项目的入口类配置了@EnableAutoConfiguration,在SpringBoot框架启动是就会自动根据导入的jar包来加载spring-boot-autoconfigure-1.5.4.RELEASE-sources.jar中的xxxAutoconfiguration配置类,使用其默认配置。
     
    源码:
    @SuppressWarnings("deprecation")
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(EnableAutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
    
        String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    
        Class<?>[] exclude() default {};
    
        String[] excludeName() default {};
    
    }
    属性说明:
    exclude属性:使用Class格式的方式,排除默认自动启动中不需要的配置类
    excludeName属性:使用类的限制名的方式,排序默认自动启动中不需要的配置类
     
    7.3 @SpringBootApplication注解
    源码:
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = {
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {
    @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude")
    Class<?>[] exclude() default {};
    @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName")
    String[] excludeName() default {};
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};
    }
    根据源码可以得出:@SpringBootApplication注解也是启动Springboot的默认配置。只是在@EnableAutoConfiguration注解的基础上增加了扫描包@ComponentScan的这个注解。实现了并且扫描指定范围的类创建对象到容器里面。
     
    属性说明:
    1.basePackages属性
    @SpringBootApplication默认扫描的范围是使用该注解的当前的类的包以及子包,如果要指定其他范围的包,可以是basePackages指定。
    2.basePackageClasses属性
    用于精确指定哪些类需要创建对象加载到Spring容器里面。
    3.exclude属性
    通过Class的方式排除不扫描的类,就是该类不创建对象。
    4.excludeName属性
    通过类的全限制名的方式,排除不扫描的类,指定的类不会在容器中创建对象。
     
    7.4 @AutoConfigureBefore注解
    作用:指定在SpringBoot框架自动配置的配置类执行完成之前,执行指定的自定义的配置类。
    如果放在Application入口类,表示在所有自动配置的配置类还没有执行就先加载自定义的配置类。
     
    源码:
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE })
    public @interface AutoConfigureBefore {
    
        Class<?>[] value() default {};
    
        String[] name() default {};
    }
    属性说明:
    value:使用类的方式指定自动配置类
    name:使用类的全限制名(字符串)类指定配置类
     
    7.5 @AutoConfigureAfter注解
    作用:指定在SpringBoot框架自动配置的配置类执行完成之后,然后执行指定的自定义的配置类。
    源码:
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE })
    public @interface AutoConfigureAfter {
    
        Class<?>[] value() default {};
    
        String[] name() default {};
    
    }
    属性说明:
    value:使用类的方式指定自动配置类
    name:使用类的全限制名(字符串)类指定配置类
     
    7.6 @SpringBootTest注解
    作用:用于使用JUnit测试SpringBoot程序时,启动SpringBoot框架。测试SpringBoot一定要加上。
    示例:
    package com.gjs.springBoot.test;
     
    import java.sql.SQLException;
    import javax.sql.DataSource;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest//如果不加该注解,无法启动SpringBoot
    public class DataSourceTest {
        @Autowired
        private DataSource dataSource;
        @Test
        public void dataSource() {
            try {
                System.out.println(dataSource.getConnection());
             } catch (SQLException e) {
                    e.printStackTrace();
                }
             }
    }
    8.SpringBoot配置流程(A)
    SpringBoot框架是一个将整合框架的整合代码都写好了的框架。但整合框架有些属性是需要我们配置的,而这些属性名是SpringBoot规定好的,我们需要找到这些属性然后对其进行配置。
    我们需要知道如何找到各种整合框架可以配置的属性,以及属性对应的属性名。
     
    配置流程说明:
    1.在SpringBoot的spring-boot-autoconfigure-1.5.4.RELEASE.jar中编写了所以内置支持的框架的自动整合代码
    2.所有支持的框架根据功能类型来划分包,每个包都有一个XxxxAutoConfiguration配置类,都是一个基于纯注解的配置类,是各种框架整合的框架代码。
    3.如果配置的框架有默认的配置参数,都放在一个命名为XxxxProperties的属性
    4.通过项目的resources下的application.properties文件可以修改每个整合框架的默认属性,从而实现了快速整合的目的。
     
    配置流程图:
    0
     
    9.配置文件
    Spring Boot的参数配置文件支持两种格式。分别为application.propertie,application.yml。
    配置Spring Boot时可以二选一。
    application.propertie:是键值对风格
    application.yml:是层级键值对风格
     
    9.1 application.propertie配置文件
    默认情况下,Spring Boot会加载resources目录下的application.properties来获得配置的参数。
     
    application.propertie多配置文件支持:
    1.在application.properties配置文件下,增加多个application-xxx.properties文件名的配置文件,其中xxx是一个任意的字符串。
    如:application-database.properties
    application-mvc.properties
    application-freemarker.properties
     
    2.在application.properties总配置文件指定,加载的多个配置文件
    spring.profiles.active=database,mvc,freemarker
    9.2 application.yml配置文件
    SpringBoot支持一种由SpringBoot框架自制的配置文件格式。后缀为yml。yml后缀的配置文件的功能和properties后缀的配置文件的功能是一致的。
    例如:配置文件:application.properties
    #配置数据源
    spring.datasource.url=jdbc:mysql://localhost:3306/school
    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
    #spring-data-jpa配置
    #显示SQL语句
    spring.jpa.show-sql=true
    #表示是否需要根据view的生命周期来决定session是否关闭
    spring.jpa.open-in-view=true
    可以修改为配置文件:application.yml,内容为:
    #配置数据源
    spring:
        datasource:
          url: jdbc:mysql://localhost:3306/school
          driverClassName: com.mysql.jdbc.Driver
          username: root
          password: 123456
          #配置连接池
          type: org.apache.commons.dbcp2.BasicDataSource
        #配置JPA的属性  
        jpa:
          show-sql: true
          open-in-view: true
    其实application.yml配置文件就是将原来application.properties使用(.)分割的方式,改为树状结构,使用(:)分割。
    注:key的字段与值之间的冒号(:)后面一定要有一个空格。
     
    application.yml多配置文件支持:
    1.在application.yml配置文件下,增加多个application-xxx.yml文件名的配置文件,其中xxx是一个任意的字符串。
    例如:application-database.yml
    application-mvc.yml
    application-freemarker.yml
     
    2.在application.yml总配置文件指定,加载的多个配置文件
    spring:
       profiles:
         active: database,mvc,freemarker
     
    9.3 配置示例-Spring数据源配置
    配置Spring数据源,并支持DBCP2数据源:
    1.在pom.xml加入支持数据源的类库
    <!-- 数据库驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!-- dbcp2连接池 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-dbcp2</artifactId>
            </dependency>
               <!-- Springboot测试包 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
              <!-- jdbc -->
                <!-- SpringBoot配置jdbc模块,必须导入JDBC包的 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
            </dependency>
    2.找到数据源的配置类
    0
    3.数据源的配置类的属性如下
    /prefix 前缀:在配置文件用spring.datasource.属性名=值 来配置属性
    @ConfigurationProperties(prefix = "spring.datasource") 
    public class DataSourceProperties
            implements BeanClassLoaderAware, EnvironmentAware, InitializingBean {
    
        private ClassLoader classLoader;
    
        private Environment environment;
    
        private String name = "testdb";
    
        private boolean generateUniqueName;
    
        //必须配置的属性 
        private Class<? extends DataSource> type; //数据源类型:数据源全限定名
        private String driverClassName; //数据库驱动名
        private String url;  //数据库地址
        private String username; //数据库账号
        private String password; //数据库密码
    
    
        private String jndiName;
    
        private boolean initialize = true;
    
        private String platform = "all";
    
        private List<String> schema;
    
        private String schemaUsername;
    
        private String schemaPassword;
    
        private List<String> data;
    
        private String dataUsername;
    
        private String dataPassword;
    
        private boolean continueOnError = false;
    
        private String separator = ";";
    
        private Charset sqlScriptEncoding;
    
        private EmbeddedDatabaseConnection embeddedDatabaseConnection = EmbeddedDatabaseConnection.NONE;
    
        private Xa xa = new Xa();
    
        private String uniqueName;
    4.application.properties配置文件修改数据源参数:
    #datasource
    spring.datasource.url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.datasource.username=root
    spring.datasource.password=1234
    #support dbcp2 datasource
    spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
    5. 测试代码
    package com.gjs.springBoot.tset;
    import java.sql.SQLException;
    import javax.sql.DataSource;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    //SpringBoot测试要加上这个注解
    @SpringBootTest
    public class DataSourceTest {
        
        @Autowired
        private DataSource dataSource;
    
        @Test
        public void dataSource() {
            try {
                System.out.println(dataSource.getConnection());
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    9.4 获得自定义application.properties声明的属性值
    使用@ConfigurationProperties注解可以直接获得application.properties配置的属性值。
     
    1.@ConfigurationProperties属性说明:
    prefix属性:表示获得application.properties时忽略的指定的前缀,如:
    @ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
    ignoreUnknownFields属性:忽略未知的字段值。如果为true时,就是当application.properties设置的输入找不到对应的字段时,就忽略它。
     
    2.使用@ConfigurationProperties需要导入支持的依赖包:
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
    </dependency>
    3.只需要在类上打上@ConfigurationProperties就能直接使用application.properties配置的属性值
    不用再使用@value注解
     
     
     
     
     
    作者:ki16
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    sqli-labs(二)
    sqli-labs(一)
    路径遍历:ZIP条目覆盖
    JWT
    ActiveMQ漏洞利用方法总结
    Tomcat任意文件上传漏洞CVE-2017-12615
    jsp的文件包含漏洞
    记一次渗透实验(四)
    unity独立游戏开发日志2018/09/22
    python网络编程的坑(持续更新)
  • 原文地址:https://www.cnblogs.com/gaojinshun/p/14529389.html
Copyright © 2011-2022 走看看