SpringBoot简要笔记

Posted 尚墨1111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot简要笔记相关的知识,希望对你有一定的参考价值。

SpringBoot

其实SpringBoot的东西用起来非常简单,因为SpringBoot最大的特点就是自动装配。

1. 使用SpringBoot的步骤:

1、创建一个SpringBoot应用,选择我们需要的模块,SpringBoot就会默认将我们的需要的模块自动配置好

2、手动在配置文件中配置部分配置项目就可以运行起来了

3、专注编写业务代码,不需要考虑以前那样一大堆的配置了。

要熟悉掌握开发,之前学习的自动配置的原理一定要搞明白!

比如SpringBoot到底帮我们配置了什么?我们能不能修改?我们能修改哪些配置?我们能不能扩展?

  • 向容器中自动配置组件 :*** Autoconfiguration
  • 自动配置类,封装配置文件的内容:***Properties

没事就找找类,看看自动装配原理!

YAML 配置文件:“Yet Another Markup Language”(仍是一种标记语言)

person:
  name: sommer
  age: 18
  high: false
  birthday: 2020/1/1
  data: {high: 180,weight: 55}
  like:
    - happy
    - run
    - eat
  dog:
    name: lulu
    age: 10

2 注解

@SpringBootApplication:标注在某个类上说明这个类是SpringBoot的主配置

@SpringBootConfiguration:作用:SpringBoot的配置类 , 表示这是一个SpringBoot的配置类;

@SpringBootTest,springBoot 的测试类

@Configuration,说明这是一个spring的配置类 ,配置类就是对应Spring的xml 配置文件;

**@PropertySource :**加载指定的配置文件;

@configurationProperties:默认从全局配置文件中获取值;

@ConfigurationProperties(prefix = “person”),将配置文件中配置的每一个属性的值,映射到这个组件中;
prefix = “person” : 将配置文件中的person下面的所有属性一一对应

@PropertySource(value = “classpath:person.properties”),选择指定的配置文件为person.properties

@Value("${name}"),获取到配置文件中name对应的值,注入属性中

数据校验

@Validated:开启数据校验,保证数据类型的正确性

@Email(message="报错提示语")
@NotNull(message="名字不能为空")
@Max(value=120,message="年龄最大不能查过120")

空检查
@Null       验证对象是否为null
@NotNull    验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank   检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty   检查约束元素是否为NULL或者是EMPTY.
    
Booelan检查
@AssertTrue     验证 Boolean 对象是否为 true  
@AssertFalse    验证 Boolean 对象是否为 false  
    
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
@Length(min=, max=) string is between min and max included.

日期检查
@Past       验证 Date 和 Calendar 对象是否在当前时间之前  
@Future     验证 Date 和 Calendar 对象是否在当前时间之后  
@Pattern    验证 String 对象是否符合正则表达式的规则

3 多环境配置

我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml, 用来指定多个环境版本;

application-test.properties 代表测试环境配置

application-dev.properties 代表开发环境配置

选择一个配置来激活环境

spring.profiles.active=dev

yml配置

server:
  port: 8081
#选择要激活那个环境块
spring:
  profiles:
    active: test

---
server:
  port: 8083
spring:
  profiles: dev #配置环境的名称


---

server:
  port: 8084
spring:
  profiles: test  #配置环境的名称

4 SpringBoot自动装配原理:

由于围绕SpringBoot存在很多开箱即用的Starter依赖,其实springboot的一个启动器基本上就包含两个项目,一个是spring-boot-starter,另一个是spring-boot-autoConfigure。

starter项目模块在pom文件中引入了autoConfiger这个项目,所以starter可以使用autoConfiger。

而在这个autoConfiger项目里面主要是看spring.factories这个配置文件,这个里面配置springboot官方的模块的autoConfiger

  1. SpringBoot启动会加载大量的自动配置类

  2. 根据当前不同的条件判断,决定这个配置类是否生效!

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

    @**xxxxAutoConfigurartion:自动配置类;**给容器中添加组件

    @xxxxProperties:封装配置文件中相关属性;

    @conditional

//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(prefix = "spring.http") 
public class HttpProperties {
    // .....
}

5 自定义 starter

springboot 官方给我们提供了很多启动器如:elasticsearch,aop,redis…但是实际开发中,可能不同公司的业务不同需要定制化一个通用的专属的启动器来满足公司内部使用,提高开发效率。

实现逻辑

1、starter的jar包中只是配置了具体实现autoConfiguration的pom,另外上面也没有

2、autoConfiguration这个jar项目才是实际实现的所有内容,jar包中配置好 spring,factories就行。

3、在实际的项目pom中,导入starter,starter连接autoConfiguration的jar包实现

原理

这样其他springboot 项目 引用了启动器,因为启动器 依赖 自动配置模块,然后也会扫描 自动配置模块 的 类路径下的META-INF目录下的 spring.factories HelloServiceAutoConfiguration配置类就会被拿到,然后里面的 helloService() 方法返回的HelloService对象就会被创建并且被@Bean 注解注册到ioc容器里面,这样 springboot 项目 里面就可以 通过@Autowired 注解使用 HelloService 对象了

非常详细的实现步骤:SpringBoot 自定义实现一个启动器starter 教程

补充:

@Component

@EnableConfigurationProperties(prefex=“hello”),这步操作上面会报错,上面再加上一个注解@Component

已经打包,但是修改了jar包中的实现,强制maven更新:打开maven的命令行mvn clean install -U

5 整合JDBC

新建spring-initial 项目,选择导入JDBC-API,创建项目之后,springboot会帮我们导入相关的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

项目 新建配置文件 application.yaml 中配置数据库的参数

spring:
  datasource:
    username: root
    password: admin
    #?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://localhost:3306/mytest?serverTimezone=UTC&useUnicode=true
    &characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver

测试连接

@SpringBootTest
class SpringbootDataJdbcApplicationTests {

    //DI注入数据源
    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() throws SQLException {
        //看一下默认数据源
        System.out.println(dataSource.getClass());
        //获得连接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        //关闭连接
        connection.close();
    }
}

6 操作数据库 CRUD

  1. 有了数据源,就可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;

  2. 即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即JdbcTemplate。数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。

  3. Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,使用时只需自己注入即可使用

    @RestControllerpublic
    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;
        }
    }

替换数据库由默认数据库——druid数据库

替换原生IDBC操作数据库转换成Mybatis,的mapper模式实现操作

SpringMVC

处理提交数据

2、提交的域名称和处理方法的参数名不一致

提交数据 : http://localhost:8080/hello?username=kuangshen

处理方法 :

//@RequestParam("username") : username提交的域的名称 
    @RequestMapping("/hello")
    public String hello(@RequestParam("username") String name) {
        System.out.println(name);
        return "hello";
    }

后台输出 : kuangshen

3、提交的是一个对象

要求提交的表单域和对象的属性名一致 , 参数使用对象即可

1、实体类

public class User {   
	private int id;   private String name;   
	private int age;   //构造   //get/set   //tostring()
}

2、提交数据 : http://localhost:8080/mvc04/user?name=kuangshen&id=1&age=15

3、处理方法 :

@RequestMapping("/user")public String user(User user){   
	System.out.println(user);  
	 return "hello";
 }

后台输出 : User { id=1, name=‘kuangshen’, age=15 }

说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

RestFul风格:

使用RESTful操作资源 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

http://127.0.0.1/item/1 查询,GET

http://127.0.0.1/item 新增,POST

http://127.0.0.1/item 更新,PUT

http://127.0.0.1/item/1 删除,DELETE
    //映射访问路径
    @RequestMapping("/commit/{p1}/{p2},method = {RequestMethod.POST}))
    public String index(@PathVariable int p1, @PathVariable String p2, Model model) {
        String result = p1 + p2;   //Spring MVC会自动实例化一个Model对象用于向视图中传值   
        model.addAttribute("msg", "结果:" + result);   //返回视图位置   
        return "test";
    }

以上是关于SpringBoot简要笔记的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

SpringBoot启动报错“Consider defining a bean of type ‘xxx.mapper.UserMapper‘ in your configuration.“(代码片段

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

SpringBoot中表单提交报错“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“(代码片段

Spring boot:thymeleaf 没有正确渲染片段

11SpringBoot-CRUD-thymeleaf公共页面元素抽取