spring boot 入门

一、SpringBoot简介
1. 设计初衷

​ 为了简化项目的开发,无xml开发,采用自动化的配置让程序员使用的框架更舒服,更加的专注于业务逻辑的开发。

2. 核心功能
  • 自动配置
  • 内嵌式的tomcat
  • 一系列的starters(jar包的集合)
3. 优势
  • 无xml更加便于开发
二、SpringBoot入门案例
1. 自动构建boot

目标:

​ 1.构建springboot项目

​ 2.编写HelloController返回hello world

步骤:

  • 使用idea创建空项目
  • new model—>spring init(maven上面就是)
  • 填写项目基本信息
  • 选择依赖,版本(boot)
  • 编写HelloController返回hello world

详情:

  • 填写基本信息
    在这里插入图片描述

  • 选择依赖

在这里插入图片描述

  • 编写HelloController返回hello world

在这里插入图片描述

三、SpringBoot配置文件

springboot支持两种类型的配置文件,一种是properties(key=val),另一种是yaml(yml),更加容易识别,读取更加方便。

1. 修改端口号

properties

server.port=8081

yml

server:
  port: 8082

注意:

​ 如果properties和yml中同时配置了端口号,那么以properties中为准。

2. yml支持数据类型
#基本数据类型 格式 key+ : + 空格 + val
personName: 张三
#对象类型数据
person:
  name: 于谦
  age: 50
  sex:#数组
  likes:
    - 抽烟
    - 喝酒
    - 烫头
  #集合
  books:
    - name: 葵花宝典
      writer: 郑和
    - name: 金瓶梅
      writer: 兰陵笑笑生
3. 获取yml配置文件内容
@Value
@RestController
public class HelloController {

    @Value("${personName}")
    private String name;

    @RequestMapping("hello")
    public String hello(){
        return "hello world " + name;
    }
}
@ConfigurationProperties
@Component //注入spring容器
@ConfigurationProperties(prefix = "person") //可以根据前缀注入配置文件中的val
public class Person {

    private String name;
    private Integer age;
    private String sex;
    private String likes [];
    private List<Booke> books;

   //省略set get toString
}
4. 多环境配置文件使用

properties

在这里插入图片描述

需要在总配置文件中指定使用哪个配置文件

spring.profiles.active=dev
yml多环境配置文件(自习)
四、SpringBoot整合其他技术
1. boot整合mybatis

目标:

  • 要求使用boot整合mybatis完成查询所有用户的功能

步骤:

  • 创建spring-boot-mybatis项目
  • 选择版本2.1.X版本(如果选择错误,删除重建)
  • 选择依赖:web/lombok/mybatis框架/mysql驱动
  • 编写三层架构
  • 修改配置文件db配置、mybatis配置
  • 测试访问

过程:

  • sql文件

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(50) DEFAULT NULL,
    `password` varchar(50) DEFAULT NULL,
    `name` varchar(50) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三');
    INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');
    SELECT * FROM user;
    
  • 选择版本+依赖

  • 三层架构

    @RestController
    @RequestMapping("user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        /**
         * @Author: guobuyi
         * @Date: 11:28 2020/9/18
         * @Params []
         * @ReturnType: List<User>
         * @Description: 查询所有用户
         */
        @RequestMapping("findAll")
        public List<User> findAll(){
            return userService.findAll();
        }
    }
    
    public interface UserService {
        /**
         * @Author: guobuyi
         * @Date: 11:28 2020/9/18
         * @Params []
         * @ReturnType: List<User>
         * @Description: 查询所有用户
         */
        List<User> findAll();
    }
    
    @Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private UserDao userDao;
        /**
         * @Author: guobuyi
         * @Date: 11:28 2020/9/18
         * @Params []
         * @ReturnType: List<User>
         * @Description: 查询所有用户
         */
        @Override
        public List<User> findAll() {
            return userDao.findAll();
        }
    }
    
    @Mapper //声明是一个mapper接口
    @Repository //注入到spring容器中
    public interface UserDao {
        /**
         * @Author: guobuyi
         * @Date: 11:28 2020/9/18
         * @Params []
         * @ReturnType: List<User>
         * @Description: 查询所有用户
         */
        List<User> findAll();
    }
    
  • mapper.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    
    <mapper namespace="com.itheima.dao.UserDao">
        <select id="findAll" resultType="user">
            select * from user
        </select>
    </mapper>
    
  • 配置文件

    #db配置
    spring:
      datasource:
        #serverTimezone=UTC 时区必须添加
        url: jdbc:mysql://127.0.0.1/itheima?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: root
    #mybatis
    mybatis:
      mapper-locations: classpath:mapper/*.xml #mapper.xml位置
      type-aliases-package: com.itheima.pojo #实体位置
    
    
  • 访问

    http://localhost:8080/user/findAll

2. 整合redis

目标:

  • 用于做查询所有用户的缓存

步骤:

  1. 导入redis依赖—》starter
  2. 修改配置文件—》redis
  3. 从缓存中获取用户数据
  4. 如果获取到直接返回
  5. 如果没有获取到从db查询,并且将查询结果转为json字符串放入redis再返回

过程:

  • redis依赖

      <!--redis依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
            <!-- fastjson-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.62</version>
            </dependency>
    
  • 业务逻辑

     @RequestMapping("findAllStr")
        public String findAllStr(){
            String userStr = null;
            //1.从缓存中获取数据
            userStr= (String) redisTemplate.boundValueOps("31_findAll").get();
            //2.如果获取到数据将数据赋值给userStr
            if(StringUtils.isEmpty(userStr)){ //如果userStr为空则返回true
                log.info("从redis中没有获取到数据,走db获取");
                //3.如果获取不到数据查询db
                List<User> userList = userService.findAll();
                //4.将json后的字符串赋值给userStr
                userStr = JSON.toJSONString(userList);
                //5.将db中的数据json转为字符串存入redis
                redisTemplate.boundValueOps("31_findAll").set(userStr);
            }
            return userStr;
        }
    
3. 使用RestTemplate

介绍:是一个支持http restful风格请求的工具类。

在这里插入图片描述

使用:

​ 请求百度 http://www.baidu.com

​ 请求UserController---->findAll

 /*
        测试百度
     */
    @Test
    public void case01() {
        String forObject = restTemplate.getForObject("http://www.baidu.com", String.class);
        System.out.println(forObject);
    }

    /*
        测试userController中的findAllStr
     */
    @Test
    public void case02() {
        List forObject = restTemplate.getForObject("http://localhost:8080/user/findAll", List.class);
        System.out.println(forObject);
    }
4. 测试类的使用
五、boot进阶
1. starters

一系列jar包的集合

有部分依赖为灰色是由于maven依赖的传递。

2. 父依赖作用

用于声明jar包的版本,防止jar包冲突,省却java程序员自己去适配jar版本。

3. 自动配置实现逻辑

在spring4.0时提出了一个Condition判断条件,如果判断条件为true则bean对象会被声明并注入到容器中,如果判断条件为false则不会声明注入到容器中。

4. 代码演示User Bean对象注入

步骤:

  1. 创建spring-boot-03

  2. 创建User 对象

  3. 创建UserConfig配置类—》声明User bean

    @Configuration //声明是一个配置类
    public class UserConfig {
    
        /*
            在BeanFactory中可以获取到User bean 对象
         */
        @Bean
        public User user(){
            User user = new User();
            user.setName("金莲");
            user.setAge(16);
            return user;
        }
    }
    
  4. 在启动类中获取User bean

      public static void main(String[] args) {
            //在BeanFactory中可以获取到User bean 对象
            ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringBoot03Application.class, args);
            Object user = applicationContext.getBean("user");
            System.out.println(user);
        }
    

condition原生注解使用

@Configuration //声明是一个配置类
public class UserConfig {

    /*
        在BeanFactory中可以获取到User bean 对象
     */
    @Bean
    //conditional原生注解决定是否完成注入,重写了matches方法,根据redisTemplate是否可以反射创建决定true和false
    @Conditional(Myconditional.class)
    public User user(){
        User user = new User();
        user.setName("金莲");
        user.setAge(16);
        return user;
    }
}


public class Myconditional implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //要求根据当前环境中是否有redisTemplate.class决定返回值,如果有则返回true,如果没有则返回false
        boolean flag = true;
        try {
            Class<?> aClass = Class.forName("org.springframework.data.redis.core.RedisTemplate");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }
}

condition派生注解使用

public class Apple {
    private String name;
}



@Configuration //声明是一个配置类
public class UserConfig {

 /*   @Bean
    public Apple apple(){
        return new Apple();
    }*/


    /*
        在BeanFactory中可以获取到User bean 对象
     */
    @Bean
    //conditional原生注解决定是否完成注入
    //@Conditional(Myconditional.class)
    //@ConditionalOnBean(Apple.class) //如果当前spring容器中存在Apple bean那么返回true,否则为false
    //@ConditionalOnMissingBean(Apple.class) //如果当前spring容器中不存在Apple bean那么返回true
    @ConditionalOnProperty(name = "itheima", havingValue = "31") //如果当前配置文件中存在key=itheima val=31 那么返回true,否则false
    public User user(){
        User user = new User();
        user.setName("金莲");
        user.setAge(16);
        return user;
    }
}
5. redis自动配置实现
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
6. tomcat自动配置实现
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
7. 自动配置小结

自动配置的实现:

  1. spring4.0提出了condition相关注解,增加判断条件
  2. boot中实现自动配置的判断条件一般为starters中的类
六、打包部署
1. jar(推荐)

通过ideamaven project---->package打包即可

java -jar  xxx.jar
2.war(不建议)

步骤:

  1. 在pom中声明要打为war包

    <packaging>war</packaging>
    
  2. 需要创建类继承SpringBootServletInitializer并且重写config方法

    public class MyServlet extends SpringBootServletInitializer {
    
        /*
            web.xml
         */
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(SpringBoot01Application.class);
        }
    }
    
  3. 通过ideamaven project---->package打包即可

注意事项:

  1. 使用tomcat部署时要注意版本兼容问题
  2. 在访问时要注意使用的是tomcat的端口号
  3. 在访问时要添加项目的根路径才可以访问到
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娃娃 哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值