SpringBoot学习

1.概述

一般把Spring Boot称为搭建程序的脚手架 或者说是便捷搭建 基于Spring的工程 脚手架。其最主要作用就是帮助开 发人员快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让开发人员关注 业务而非配置。

2.依赖配置

<?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>org.example</groupId>
    <artifactId>SpringBootdemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--1. 添加父工程坐标  里面已经对各种常用依赖(并非全部)的版本进行了管理-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
    </parent>


    <!--2. 添加web启动器  为了让Spring Boot帮我们完成各种自动配置,我们必须引入Spring Boot提供的自动配置依赖,我们称为启动器。因 为我们是web项目,这里我们引入web启动器-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.0.2.RELEASE</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--整合jdbc和事务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <!--mybatis -->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>2.0.1</version>-->
<!--        </dependency>-->

        <!-- 通用mapper -->
        <!-- 注意:一旦引入了通用Mapper的启动器,会覆盖Mybatis官方启动器的功能,因此需要移除对官方Mybatis启动器 的依赖。-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

        <!--Junit测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!--整合Redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>



    </dependencies>

    <!--3. 管理jdk版本-->
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <!--添加项目的pom.xml插件;在pom.xml要显式的加入插件spring-boot-maven-plugin,否则无法产生 jar 清单 文件,导致打出来的 jar 无法使用命令运行;-->
    <build>
        <plugins>
            <!-- 打jar包时如果不配置该插件,打出来的jar包没有清单文件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.注入

package com.xxx.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import javax.sql.DataSource;


/**
 * @Configuration:声明一个类作为配置类,代替xml文件
 * @Bean:声明在方法上,将方法的返回值加入Bean容器,代替<bean>标签
 * @Value:属性注入
 * @PropertySource:指定外部属性文件,
 *
 * 解读:
 * @Configuration:声明我们JdbcConfig是一个配置类
 * @PropertySource:指定属性文件的路径是: classpath:jdbc.properties
 * @Value为属性注入值
 * @Bean将 dataSource()方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值 加入Spring容器中。
 *
 * 然后我们就可以在任意位置通过@Autowired注入DataSource了!
 */

//@Configuration
//@PropertySource("classpath:jdbc.properties")


/**
 * @Configuration
 * @EnableConfigurationProperties(JdbcProperties.class)
 * 通过@EnableConfigurationProperties(JdbcProperties.class)
 * 来声明要使用JdbcProperties这个类的 对象
 *
 * @Autowired注入
 * @Bean的方法参数注入
 */
@Configuration
public class JdbcConfig {

    /**
    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.driverClassName}")
    String driverClassName;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
    */

    /**
    @Bean // 声明要注入的属性前缀,Spring Boot会自动把相关属性通过set方法注入到DataSource中
    @ConfigurationProperties(prefix = "jdbc")

     * 我们直接把@ConfigurationProperties(prefix = "jdbc")声明在需要使用的@Bean的方法上,
     * 然后Spring Boot就会自动调用这个Bean(此处是DataSource)的set方法,然后完成注入。
     * 使用的前提是:该类必须有对应属性的set方法!

    public DataSource dataSource() {
        return new DruidDataSource();
    }
     */
}

4.Yaml配置文件

#jdbc:
#  driverClassName: com.mysql.jdbc.Driver
#  url: jdbc:mysql://localhost:3306/springboot_test?useUnicode=true&characterEncoding=utf8
#  username: root
#  password: 123456


spring:
  profiles:
    active: abc,def

  #把JdbcConfig 类中的druid的配置删除或注释
  #在刚才引入jdbc启动器的时候,SpringBoot已经自动帮我们引入了一个连接池,HikariCP应该是目前速度最快的连接池
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot_test?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 123456

  redis:
    host: localhost
    port: 6379
    timeout: 10000


logging:
  level:
    com.xxx: debug
    org.springframework: info

# 映射端口
server:
  port: 80


## mybatis配置
#mybatis:
#  # 实体类别名包路径
#  type-aliases-package: com.xxx.pojo
#  # 映射文件路径
#  # mapper-locations: classpath:mappers/*.xml
#  configuration:
#    # 控制台输出执行sql
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.自动配置原理

package com.xxx;

//import org.mybatis.spring.annotation.MapperScan;
import tk.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 启动类
 * @Description TODO
 * @Version 1.0
 **/

/**
 *      1.这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了@Configuration的类,
 *          并且读取其中的配 置信息。而@SpringBootConfiguration是来声明当前类是SpringBoot应用的配置类,
 *          项目中只能有一个。所以一 般我们无需自己添加。
 *
 *      2.总结,Spring Boot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,
 *          取决于我们是否引 入了对应库所需的依赖,如果有那么默认配置就会生效,也提供了自定义配置的入口.
 *
 *      3.@SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子 包。
 *          因此,一般启动类会放在一个比较前的包目录中。
 *
 *
 *
 *
 *
 * SpringBoot为我们提供了默认配置,而默认配置生效的步骤:
 * 1.@EnableAutoConfiguration注解会去寻找META-INF/spring.factories文件,
 *      读取其中以 EnableAutoConfiguration为key的所有类的名称,
 *      这些类就是提前写好的自动配置类
 * 2.这些类都声明了@Configuration注解,并且通过@Bean注解提前配置了我们所需要的一切实例
 * 3.但是,这些配置不一定生效,因为有@ConditionalOn注解,满足一定条件才会生效。比如条件之一:
 *      是一些 相关的类要存在
 * 4.类要存在,我们只需要引入了相关依赖(启动器),依赖有了条件成立,自动配置生效。
 * 5.如果我们自己配置了相关Bean,那么会覆盖默认的自动配置的Bean
 * 6.我们还可以通过配置application.yml文件,来覆盖自动配置中的属性
 * 7.如果properties和yml文件都存在,如果有重叠属性,默认以Properties优先.
 *
 *
 */

@SpringBootApplication
@MapperScan("com.xxx.mapper")
public class Application {
    public static void main(String[] args) {
        // 启动代码
        SpringApplication.run(Application.class,args);
        System.out.println("成功22!");
    }
}

@SpringBootApplication

        @SpringBootConfiguration

        @EnableAutoConfiguration

        @ComponentScan

@SpringBootConfiguration

这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了@Configuration的类,并且读取其中的配 置信息。而@SpringBootConfiguration是来声明当前类是SpringBoot应用的配置类,项目中只能有一个。所以一 般我们无需自己添加。

@EnableAutoConfiguration

第二级的注解@EnableAutoConfiguration,告诉Spring Boot基于你所添加的依赖,去“猜测”你想要如何配 置Spring。比如我们引入了spring-boot-starter-web,而这个启动器中帮我们添加了tomcat、SpringMVC 的依赖。此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!

@ComponentScan

配置组件扫描的指令。提供了类似与<context:component-scan>标签的作用
通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明 这个注解的类所在的包开始,扫描包及子包.

而我们的@SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子 包。因此,一般启动类会放在一个比较前的包目录中。

ClassLoader默认是从classpath下读取文件,因 此,SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中的。

@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
这里的条件是OnClass,也就是满足以下类存在:Servlet、DispatcherServlet、WebMvcConfigurer,其中 Servlet只要引入了tomcat依赖自然会有,后两个需要引入SpringMVC才会有。这里就是判断你是否引入了相关 依赖,引入依赖后该条件成立,当前类的配置才会生效!

@EnableAutoConfiguration注解引入了两个属性:WebMvcProperties和 ResourceProperties。

6.Lombok

package com.xxx.pojo;

import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;


/**
 * 1.lombok插件
 * 2.引入依赖
 * 3.Bean上注解使用
 *
 * @Data :自动提供getter和setter、hashCode、equals、toString等
 * @Getter:自动提供getter方法
 * @Setter:自动提供setter方法
 * @Slf4j:自动在bean中提供log变量,
 * 其实用的是slf4j的日志功能。
 * 例如;在javabean上加@Data,那么就可以省去getter和setter等方法的编写,lombok插件会自动生成。
 *
 */

@Data
@Table(name = "tb_user") //在User实体类上加JPA注解
public class User {
    //  id
    //开启主键自动回填
    @Id  // 相当于http://localhost/user/12   中的12赋值给主键id查询 SELECT id,user_name,password,name,age,sex,birthday,created,updated,note FROM tb_user WHERE id = ?
    // 不加@Id  SELECT id,user_name,password,name,age,sex,birthday,created,updated,note FROM tb_user WHERE id = ? AND user_name = ? AND password = ? AND name = ? AND age = ? AND sex = ? AND birthday = ? AND created = ? AND updated = ? AND note = ?
    @KeySql(useGeneratedKeys = true)
    private Long id;

    //  用户名
    private String userName;
    // 密码
    private String password;
    // 姓名
    private String name;
    // 年龄
    private Integer age;
    // 性别,1男性,2女性
    private Integer sex;
    // 出生日期
    private Date birthday;
    // 创建时间
    private Date created;
    // 更新时间
    private Date updated;
    // 备注
    private String note;

}

7.实践

application.yml文件中配置日志级别控制

 访问静态资源

拦截器

通过实现WebMvcConfigurer并添加@Configuration注解来实现自定义部分SpringMvc配置 

package com.xxx.config;

import com.xxx.intercepter.MyInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class MvcConfig implements WebMvcConfigurer {
    /** * 将拦截器注册到spring ioc容器 * @return myInterceptor */
    @Bean
    public MyInterceptor myInterceptor(){
        return new MyInterceptor();
    }
    /**
     * 重写该方法;往拦截器链添加自定义拦截器
     * @param registry 拦截器链
     */
    @Override public void addInterceptors(InterceptorRegistry registry) {
        //通过registry添加myInterceptor拦截器,并设置拦截器路径为 /*
         registry.addInterceptor(myInterceptor()).addPathPatterns("/*");
    }
}
package com.xxx.intercepter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * 总结:通过实现WebMvcConfigurer并添加@Configuration注解来实现自定义部分SpringMvc配置
 *
 * @Description TODO
 * @Version 1.0
 **/

@Slf4j
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        log.debug("这是MyInterceptor拦截器的preHandle方法");
        return true;
    }

    @Override public void postHandle(HttpServletRequest request, HttpServletResponse response,
                                     Object handler, ModelAndView modelAndView) throws Exception {
        log.debug("这是MyInterceptor拦截器的postHandle方法");
    }

    @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse
            response, Object handler, Exception ex) throws Exception {
        log.debug("这是MyInterceptor拦截器的afterCompletion方法");
    }

}

整合Mybatis

启动类上添加扫描包注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值