springboot简介及知识点小结

Springboot简介:

Spring Boot是在Spring的基础上面搭设的框架,目的是为了简化Spring项目的搭设和开发过程。不存在冲突的问题。其实不是什么新的框架,它默认配置了很多的框架的使用方式,就像maven整合了所有的jar包,springboot整合了多数的框架。 

总之:人们把springboot称之为搭建程序的脚手架,其最主要的作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。

SpringBoot有哪些优点?

  • 独立运行
    Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
  • 简化配置
    spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。
  • 自动配置
    Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 spring-boot-starter-web 启动器就能拥有 web 的功能,无需其他配置。
  • 无代码生成和XML配置
    Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是 Spring4.x 的核心功能之一。
  • 避免大量的Maven导入和各种版本冲突

运行原理:

自动配置;

核心依赖在父工程中:spring-boot-dependences

我们在写或者引入springboot依赖的时候,不需要指定版本,就是因为有这些版本仓库

启动器:一段依赖

说白了就是springboot的启动场景.

Sringboot的启动器:所谓的 springBoot 启动器其实就是一些 jar 包的集合,这些启动器帮我们导入了实现各个功能所需要依赖的全部组件,我们只需要在项目中引入这些starters,相关场景的所有依赖就会全部被导入进来,并且我们可以抛弃繁杂的配置,仅需要通过配置文件来进行少量的配置就可以使用相应的功能。

starter启动器,可以通过启动器集成其他的技术,比如说:web,mybatis,Redis等等可以提供对应技术的开发和运行环境,

比如:pom中引入spring-boot-starter-web就可以进行web开发

springApplication这个类整合了其它框架的启动类,只要运行这一个类,所有的整合就完成了,

调用run函数,将当前启动类的字节码传入(主要目的是传入@SpringbootApplication这个注解)以及main函数的args参数

通过获取当前启动类的核心信息,创建IOC容器

核心设计思想:总之一个@SpringbootAplication注解就搞定了所有的事,它封装了核心的@SpringbootConfiguration+@EnableAutoConfiguration+ComponentScan这三个类,大大节省了程序员的配置时间,这就是springboot的核心设计思想。

@MapperScan:spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis 接口类的路径,即可完成对 mybatis 接口的扫描

@RestController 是 @Controller 和 @ResponseBody 的 结 合 , 一 个 类 被 加 上 @RestController 注解,数据接口中就不再需要添加@ResponseBody,更加简洁。  @RequestMapping,我们都需要明确请求的路径.

 @GetMappping,@PostMapping, @PutMapping, @DeleteMapping 结 合 @RequestMapping 使用, 是 Rest 风格的, 指定更明确的子路径.

 @PathVariable:路径变量注解,用{}来定义 url 部分的变量名.

 @Service 这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个 注解交给 spring 容器。事务的切面也会配置在这一层。当让 这个注解不是一定要用。 有个泛指组件的注解,当我们不能确定具体作用的时候 可以用泛指组件的注解托付给 spring 容器

@Component 和 spring 的注解功能一样, 注入到 IOC 容器中.

@ControllerAdvice 和 @ExceptionHandler 配合完成统一异常拦截处理

知识点小结:

一,可以在官网直接下载,还可以用idea下载。

二,启动类

package com.zhang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//标注这个类是一个springboot的应用
@SpringBootApplication
public class Springboot01HelloworldApplication {
//springboot 应用启动
   
public static void main(String[] args) {
       
SpringApplication.run(Springboot01HelloworldApplication.class, args);
    }

}

三,springboot自动装配原理探究:

pom.xml:

spring-boot-dependencies:核心依赖在父工程中

我们在写或引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本仓库。

启动器:说白了就是springboot的启动场景

<dependency>
    <
groupId>org.springframework.boot</groupId>
    <
artifactId>spring-boot-starter</artifactId>
</
dependency>

比如;spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖

springboot会将所有的功能场景,都变成一个个的启动器

我们要使用什么功能,就只需要找到对应的启动器就可以了,starter

四:主程序:

package com.zhang;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication; //标注这个类是一个springboot的应用:启动类下的所有资源被导入

@SpringBootApplication public class Springboot01HelloworldApplication { //springboot 应用启动    

public static void main(String[] args) {         SpringApplication.run(Springboot01HelloworldApplication.class, args);  

   } }

注解:

@SpringBootApplicationspringboot的配置
   @Configurationspring配置类
 @Component:说明这是一个spring的组件
@EnableAutoConfiguration:自动配置 
@AutoConfigurationPackage:自动配置包
 @Import({Registrar.class}):自动配置包注册 @Import({AutoConfigurationImportSelector.class}):自动配置导入选择
结论:springboot所有的自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功。
  1. springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
  2. 将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置。
  3. 以前我们需要自动配置的东西,现在springboot帮我们做了
  4. 整合JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0RELEASE。jar这个包下面
  5. 他会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器中;
  6. 容器中也会存在非常多的xxxAutoConfiguaratio的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件;并自动配置,@Configuration,JavaConfig
  7. 有了自动配置,免去了我们手动编写配置文件的工作!

五:关于springboot谈谈你的理解:

自动装配:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。

个人认为:自动装配就是通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能。

run():

了解一下主启动类是怎么运行;

主要做了4件事,

推断应用的类型是普通的项目还是web项目

查找并加载所有可用的初始化器,设置到initizers属性中

找出所有的应用程序监听器,设置到listener中

推断并设置main方法的定义类,找到运行的主类。

六:

yaml语法讲解:

springboot使用的厍配置文件是固定的,application.properties或者application.yml,最好用后者。

配置文件的作用:修改springboot自动配置的默认值,因为springboot在底层都给我们自动配置好了。

application.yaml文件:可以给实体类赋值

#k=v
#d
对空格的要求非常高
#普通的key-value
name:lingdu
#对象
student:
  name:lingdu
  age:24

#行内写法
 
student:{name:ligndu,age:24}
#数组
pets:
  - cat
  - dag
  - pig

实体类加注解变红需要加入一个依赖:

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

//这里是配置类的值跟配置文件绑定,用的是yaml
@ConfigurationProperties(prefix = "person")

@Component这个注解不能少

上面注解的作用:将配置文件中配置的每个属性的值,映射到这个组件中;

告诉springboot将本类中的所有属性和配置文件相关的配置进行绑定,

参数:prefix = "person"  :将配置文件中person下面的所有属性一一对应,

只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能。

先编写实体类

再写yaml文件配置实体类

最后将实体类和文件映射。

七:JSR303效验:是写在实体类上面的

@Validated//数据校验
public class person {

   
@Email(message="格式输入错误")
   
private String name;

松散绑定:比如yaml中写last_name,实体类中是lastName,这个就是松散绑定。

这里遇到了一个问题:为什么无法导入依赖,原因是maven地址没有改,直接改掉,以后导入项目就是自己的默认地址了。

多种环境配置及配置文件位置:

有两种:

关于properties的,建立3个,标明名字,用的时候选择

关于yaml的,同一个文件夹中写多个,用的时候标明即可。

配置文件的优先级:

项目路径下的config文件夹配置文件

项目路径下配置文件

资源路径下的config文件夹配置文件

资源路径下配置文件

server:
 
port: 8081
spring:
 
profiles:
   
active: dev//这里是选择使用那个端口号的,如果这三段不写则默认使用8081口。
---
server:
 
port: 8082
spring:
 
profiles: dev
---

server:
 
port: 8083   
spring:
 
profiles: test

八:自动配置原理理解:需要细看

精髓:

springboot会加载大量的自动配置类

我们看我们需要的功能有没有在springboot默认写好的自动配置类当中;

我们再来看这个自动配置类中配置了哪些组件(只要我们要用的这些组件存在其中,我们就不需要再爱手动配置了)

给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们只需要在文件中指定这些属性的值即可。

看日志输出:debug=true,可以看自动配置哪些生效

九:thameleaf:模板引擎

首先导入依赖:

<dependency>
    <
groupId>org.springframework.boot</groupId>
    <
artifactId>spring-boot-starter-thymeleaf</artifactId>
</
dependency>

依赖导入错误可能会出现问题,找到这个依赖的文件夹直接删掉再从新下载一下就好了。

前端页面:这里加入了一个约束。

<!DOCTYPE html>
<
html lang="en" xmlns:th="http://www.thymeleaf.org">
<
head>
    <
meta charset="UTF-8">
    <
title>首页</title>
</
head>
<
body>
<
div th:text="${msg}"></div>
</
body>
</
html>

templates:下面的资源需要通过controller来访问,

使用了模板引擎们可以将html放到templates目录。

十:扩展springmvc

springboot中,有非常多的xxxConfiguration帮组我们进行配置,只要看见了这个东西,破门就要注意了!

自定义视图解析器:

所有的东西都经过DispatherServlet

@Configuration
public class MyMvcconfig implements WebMvcConfigurer {
   
//ViewReolver 实现了视图解析器接口的类,我们就可以把它看做属兔解析器
   
@Bean
   
public ViewResolver  myViewRsolver(){
       
return new MyViewReslver();
    }
   
   
//自定义一个视图解析器,静态内部类
   
public static class MyViewReslver implements ViewResolver{

       
@Override
       
public View resolveViewName(String viewName, Locale locale) throws Exception {
           
return null;
        }
    }
}

十一:登录拦截器

public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //登录成功之后,应该有用户的session

        Object loginuser = request.getSession().getAttribute("loginuser");

        if (loginuser == null) {

            //没有登录,而是直接进入的首页,肯定是不让进的

            request.setAttribute("msg", "没有权限,请先登录");

            request.getRequestDispatcher("/index.html").forward(request, response);

            return false;

        } else {

            return true;

        }

    }

}

添加拦截器:

@Configuration

public class MyMvcConfig implements WebMvcConfigurer {

    @Override

    public void addViewControllers(ViewControllerRegistry registry) {

        registry.addViewController("/").setViewName("index");

        registry.addViewController("/index.html").setViewName("index");

        registry.addViewController("/main.html").setViewName("dashboard");

    }

//自定义的国际化组件就生效了

    @Bean

    public LocaleResolver localeResolver() {

        return new MyLocaleResolver();

    }

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new LoginHandlerInterceptor())

                .addPathPatterns("/**").excludePathPatterns("/index.html", "/", "/user/login", "/asserts/**");

    }

}

十二:整合druid数据源

导入依赖:

<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>druid</artifactId>

    <version>1.2.6</version>

</dependency>

yaml文件配置:

spring:

  datasource:

    username: root

    password: root

    url: jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8

    driver-class-name: com.mysql.cj.jdbc.Driver

    type: com.alibaba.druid.pool.DruidDataSource

# springboot默认是不注入这些属性值的,需要自己绑定

#    druid数据源专有配置

    initialSize: 5

    minIdle: 5

    maxActive: 20

    maxWait: 60000

    timeBetweenEvictionRunsMillis: 60000

    minEvictableIdleTimeMillis: 300000

    validationQuery: SELECT 1 FROM DUAL

    testWhileIdle: true

    testOnBorrow: false

    testOnReturn: false

poolPreparedStatements: true

    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入

    #如果允许报错,java.lang.ClassNotFoundException: org.apache.Log4j.Properity

    #则导入log4j 依赖就行

    filters: stat,wall,log4j

    maxPoolPreparedStatementPerConnectionSize: 20

    useGlobalDataSourceStat: true

connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

控制层:

@RestController

public class JDBCController {

    @Autowired

    JdbcTemplate  jdbcTemplate;

    //查询数据库的所有信息

    //没有实体类,怎么查询,用map

    @GetMapping("/userList")

    public List<Map<String,Object>> userList(){

        String sql="select * from user";

        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);

        return maps;

    }

}

@Configuration

public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")

    @Bean

    public DataSource druidDataSource(){

        return new DruidDataSource();

    }

    //后台监控:web.xml  ServletregisterationBean

    //因为springboot内置了servlet容器,所以没有web.xml,替代方法:ServletRegisterationBean

    @Bean

    public ServletRegistrationBean  statViewServlet(){

       ServletRegistrationBean<StatViewServlet> bean=new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");

       //后台需要有人登录,账号密码设置

        HashMap<String, String> initParameters= new HashMap<>();

        //增加配置

        initParameters.put("loginUsername","admin");//登录的账号密码是固定的

        initParameters.put("loginPassword","123456");

        //允许谁可以访问

        initParameters.put("allow","");

        //禁止谁访问;

//        initParameters.put("zhang","192.068.11.11");

        bean.setInitParameters(initParameters);//设置初始化参数

        return bean;

    }

    //filter

    public FilterRegistrationBean  webStatFilter(){

        FilterRegistrationBean bean = new FilterRegistrationBean();

        bean.setFilter(new WebStatFilter());

        //可以过滤哪些请求呢?

        Map<String,String> initparameters=new HashMap<>();

        //这些东西不进行统计

        initparameters.put("exclusions","*.js,*.css,/druid/*");

        bean.setInitParameters(initparameters);

        return bean;

    }

}

十三:整合mybatis:

导入依赖:

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

properties配置文件

spring.datasource.username=root

spring.datasource.password=root

spring.datasource.url=jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#整合mybatis

mybatis.type-aliases-package=com.zhang.pojo

mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

##mybatis.configuration.lazy-load-trigger-methods=

mybatis配置;

//@Mapper

//@Repository  //被spring整合

//public interface AccountMapper {

//    //这个注解表示这是一个mybatis的Mapper类,相当于在.xml文件中绑定接口。

编写SQL

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值