SpringBoot学习笔记

SpringBOOt概念

SpringBoot提供了一种快速使用Spring的方式,基于约定大于配置的思想,让开发人员专注于逻辑业务,从而提高开发效率

SpringBoot快速入门

搭建SpringBoot工程,定义HelloChontroller.hello()方法,返回”Hello SpringBoot”

  • SpringBoot在创建项目时,使用jar打包
  • SpringBoot的引导类是整个项目的入口,运行main方法即可启动
  • 使用SpringBoot和Spring构建的项目,业务代码方式完全一样

SpringBoot配置

SpringBoot是基于约定的,很多配置有默认值,可以使用application.properties和application.yaml(yml)进行自定义配置

  • properties:
server.port=8080
  • yml:
server:
  port: 8080
  • SpringBoot提供了2种配置文件类型:properties和yml/yaml
  • 配置文件名称必须是application
  • 在同一级目录下的优先级顺序:properties>yml>yaml

yaml是一种能够直观的被电脑识别的数据序列化格式,并且更容易被人类阅读,其文件的扩展名可以使用.yml或者.yaml

  • yaml格式
server:
  port: 8080
  address: 127.0.0.1

简洁,以数据为核心

  • 对象(map):键值对的集合
person:
  name: zhangsan
#行内写法
person: {name: zhangsan}
address:
  - beijing
  - shanghai
行内写法
address: [beijing,shanghai]
  • 纯量:单个值,不可再分
msg1: 'hello \n world' # 单引号忽略转义字符
msg2: "hello \n world" # 双引号识别转义字符
name: zhangsan
person:
  name: ${name}
  • @value
    @Value("${name}")
    private String name;
  • Enviroment
    @Autowired
    private Environment environment;
    System.out.println(environment.getProperty("person.name"));
  • @ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "person")
public class Person{}

SpringBoot开发的应用通常会被安装到不同的环境(开发、测试、生产),其中数据库地址、服务器端口等等配置需要在打包时进行修改。profile能够对配置环境进行动态切换。

  • 多profile文件方式(创建多个profile文件如application-dev.properties/application-pro.properties/application-test.properties)
  • yml多文档方式(利用 ---将文档分割)

  • 配置文件
spring:
  profiles:
    active: dev #dev/pro/test
  • 虚拟机参数: -Dspring.profiles.active=test
  • 命令行参数: --spring.profiles.active=pro

SpringBoot程序启动时,会从以下为主加载配置文件:

SpringBoot整合其他框架

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-test</artifactid>
            <scope>test</scope>
        </dependency>
  • @RunWith(SpringRunner.class)
  • @SpringBootTest(classes=启动类.class)
@SpringBootTest(classes = SpringBootStudyApplication.class)
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void test(){
        userService.add();
    }
}
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-data-redis</artifactid>
        </dependency>
spring:
  redis:
    host:127.0.0.1
    port:6379
@Autowired
private RedisTemplate redistemplate;
        <dependency>
            <groupid>org.mybatis.spring.boot</groupid>
            <artifactid>mybatis-spring-boot-starter</artifactid>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupid>mysql</groupid>
            <artifactid>mysql-connector-java</artifactid>
            <scope>runtime</scope>
        </dependency>
datasource
spring:
  datasource:
    url: jdbc:mysql:///test_db
    username: root
    password:
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  type-aliases-package: com.rsk.springboot1.entity
@Mapper
public interface UserMapper {

    public List<user> findAll();

}

@Autowired
private UserMapper userMapper;

</user>

SpringBoot原理分析

Condition是Spring4.0增加的条件判断功能,可实现选择性的Bean创建,可自定义扩展

  • 自定义扩展步骤:
public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Map<string, object> annotationAttributes = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
        //&#x83B7;&#x53D6;&#x6CE8;&#x89E3;&#x4F20;&#x5165;&#x7684;&#x5143;&#x6570;&#x636E;&#x4E2D;&#x7684;&#x952E;&#x503C;&#x5BF9;map
        String[] value = (String[]) annotationAttributes.get("value");
        //&#x81EA;&#x5B9A;&#x4E49;&#x6761;&#x4EF6;&#x5224;&#x65AD;&#x51FD;&#x6570;
        if (value[0].equals("0")){
            return true;
        }
        return false;
    }
}
</string,>
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyCondition.class)
public @interface ConditionOnClass {
    String[] value();
}

@Configuration
public class UserConfig {

    @Bean
    @ConditionOnClass(value = "1")
    public User user(){
        return new User();
    }
}

  • SpringBoot提供的常用条件注解:

@Enable*注解用于动态启动某些功能,底层原理是使用@Import注解导入一些配置类,实现Bean的动态加载

@Enable*底层依赖@Import注解导入所需要的类,使用@Import注解导入的类会被Spring容器加载到IOC容器中,以下有4种用法:

  • 导入Bean
  • 导入配置类
  • 导入ImportSelector实现类,一般用于加载配置文件中的类
  • 导入ImportBeanDefinitionRegistrar实现类

  • @EnableAutoConfiguration注解内部使用 @Import({AutoConfigurationImportSelector.class})来加载配置类

  • 配置文件位置:\META-INF\spring.factories,该配置文件中定义了大量的配置类,当SpringBoot启动时会自动加载这些配置类,初始化Bean
  • 不是所有Bean都会被初始化,在配置类中使用@Configuration注解来加载满足条件的Bean

需求:(自定义redis-starter,要求导入该坐标时,SpringBoot能够自动创建Bean)
步骤:

Original: https://www.cnblogs.com/rskblog/p/16328057.html
Author: 小小的脑袋
Title: SpringBoot学习笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/569475/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 常用Dos命令

    文件夹上面的路径换成cmd 进入控制台,并且控制台的路径,也就是当前的文件夹cmd地方的文件路径管理员方式运行Cmd 此电脑搜索cmd –>命令提示符 &#821…

    Java 2023年6月6日
    089
  • 练习阅读新闻

    从小到大对新闻不敏感,直到现在复试面试时,老师可能会问到最近的一些热点新闻,才开始关注。可以这么说,我对于世界的认识,还停留在高中的历史课……可见我多么迂腐…

    Java 2023年6月5日
    082
  • Java8日期时间(LocalDate、LocalTime、LocalDateTime)

    在看题的时候发现了Java8中新加入的日期时间类,觉得这个小哥写的不错,自己也跟着练习下。原文地址:https://blog.csdn.net/yy139926/article/d…

    Java 2023年6月6日
    091
  • 图解Dijkstra算法+代码实现

    简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstr…

    Java 2023年6月9日
    0110
  • C++基础-模板

    模板(不深挖哦,是最最浅的) 基本概念 模板就是建立通用的模具,大大提高复用性(类型参数化) 模板不能直接使用,它是一个框架 模板的通用不是万能的 函数模板 C++另一种编程思想为…

    Java 2023年6月5日
    084
  • 分布式锁的实现方案

    什么是分布式锁 当多个进程在同一个系统中,用分布式锁控制多个进程对资源的访问 分布式锁应用场景 传统的单体应用单机部署情况下,可以使用java并发处理相关的API进行互斥控制。 分…

    Java 2023年6月13日
    080
  • Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash……系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历…

    Java 2023年5月29日
    077
  • Spring Cloud Eureka 使用 IP 地址进行服务注册

    默认情况下,Eureka 使用 hostname 进行服务注册,以及服务信息的显示,那如果我们使用 IP 地址的方式,该如何配置呢?答案就是 eureka.instance.pre…

    Java 2023年5月30日
    085
  • Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

    $remote_addr 代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下: &#x7528;&#x62…

    Java 2023年6月16日
    081
  • Mybatis完整版详解

    一、简介 1.什么是MyBatis MyBatis 是一款优秀的持久层框架 它支持自定义 SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参…

    Java 2023年6月14日
    059
  • Log4j2详解——XML配置详解

    Log4j2详解——XML配置详解 找到了个很详细的文章链接 https://www.jianshu.com/p/bfc182ee33db Original: https://ww…

    Java 2023年6月7日
    086
  • spring cloud alibaba (一)

    Spring Cloud Alibaba 官网:https://spring.io/projects/spring-cloud-alibabagitHub:https://gith…

    Java 2023年6月5日
    072
  • 工厂模式-理解Spring的Bean工厂(马士兵经典例子)

    工厂模式-理解Spring的Bean工厂 接面向对象里面 “老张开车去东北”的场景。链接名称 封装”老张开车去东北”里面的交通工具,…

    Java 2023年5月30日
    093
  • java-单例详解

    一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。 二. 单例模式的特点 单例模式只能有一个实例。 单例类…

    Java 2023年6月8日
    082
  • 自定义博客园主题

    博客园主题代码GitHub地址 https://github.com/yushixin-1024/Cnblogs-Theme-SimpleMemory 该项目Fork自https:…

    Java 2023年6月8日
    0128
  • 图解|12张图告诉你MySQL的主键查询为什么这么快

    这是图解MySQL的第3篇文章,这篇文章会让大家清楚地明白: 什么是InnoDB行格式?InnoDB页是什么? InnoDB页和InnoDB行格式都有哪些字段信息? 为什么推荐使用…

    Java 2023年6月7日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球