SpringBoot-Day1

1.Springboot入门

  1. 创建Maven工程

  2. 导入spring-boot-stater-web起步依赖

  3. 编写Controller

  4. 提供启动类

2.yml配置信息书写与获取

书写

# 发件人信息
email:
  user: 172349823457@qq.com
  code: sajdajlwhjfgfkllw
  host: smtp.qq.com
  auth: true
​
# 学生爱好
hobbies:
 - 打篮球
 - 踢足球
 - 打游戏

获取

@Value("${mail.user}")

更便利的方法:

# 要求实体类的成员变量名与配置文件中的键名保持一致
@ConfigurationProperties(prefix = "email")

3.bean扫描

// 启动类
@SpringBootApplication
public class SpringBootQuickstartApplication{
  public static void main(String[] args){
    SpringApplication.run(SpringbootQuickstartApplication.class,args);
  }
}
​
​
//其中@SpringBootApplication包含了以下内容
@SpringBiitConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication{
}
​
//也可以通过@ComponentScan(basePackages="com.example")来扫描包

4.bean注册

如果要注册的bean对象来自第三方,是无法用@Component及其衍生注解声明bean 的

//通过@Bean
​
//直接在启动类中,编写
//注入Country对象
@Bean //将方法返回值交给IOC容器管理,成为IOC容器的bean对象
public Country country(){
  return new Country();
}
​
​
​
​
​
//通过@Import
​
//1.导入配置类
@Import(CommonConfig.class)
@SpringBootApplication
public class SpringBootApplication{
}
​
//2.导入ImportSelector接口实现类
public class CommonImportSelector Implements ImportSelector{
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata){
        return new String[]("com.example.config.CommonConfig");
    }
}
​
​
public class CommonImportSelector implements ImportSelector {
    @Ovrride
    public String[] selectImports(AnnotationMetadata importingClassMetadata){
        // 读取配置文件的内容
        List<String> imports = new ArrayList<>();
        InputStream is = CommonImportSelector.class.getClassLoader().getResourceAsStream("common.imports");
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        try {
            while((line = br.readLine())!=null){
                imports.add(line);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (br!=null){
                try {
                    br.close();
                }catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return imports.toArray(new String[0]);
    }
}

5.注册条件

SpringBoot提供了设置注册生效条件的注解@Conditional

//若配置文件中配置了指定的信息,则注入,否则不注入
@ConditionalOnProperty(prefix = "country",name = {"name","system"})
@Bean
public Country country(@Value("${country.name}") String name,@Value("${country.system}") String system){
    Country country = new Country();
    country.setName(name);
    country.setSystem(system);
    return country;
}
​
//若IOC容器中不存在Country,则注入Province,否则不注入
@Bean
@ConditionalOnMissingBean(Country.class)
public Province province(){
    return new Province();
}
​
//若当前环境中存在DispatcherServlet类,则注入Province,否则不注入
//若当前引入了web起步依赖,则环境中有DispatcherServlet,否则没有
@Bean
@ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet")
public Province province(){
    return new Province();
}

6.自动配置原理

遵循约定大于配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器中

7.自定义starter

@AutoConfiguration //表示当前类是一个自动配置类
public class MyBatisAutoConfig {
   //SqlSessionFactoryBean
   @Bean
   public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
   SqlSessionFactoryBean sqlSessionFactoryBean();
   sqlSessionFactoryBean.setDataSource(dataSource);
   return sqlSessionFactoryBean;
   }
   
   //MapperScannerConfigure
   @Bean
   public MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory){
   MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
   //扫描的包:启动类所在的包及其子包
   List<String> packages = AutoConfigurationPackages.get(beanFactory);
   String p = packages.get(0);
   mapperScannerConfigurer.setBasePackage(p);
   
   //扫描的注解
   mapperScannerConfigurer.setAnnotationClass(Mapper.class);
   return mapperScannerConfigurer;
   }
}

步骤

  1. 创建 dmybatis-spring-boot-autoconfigure 模块,提供自动配置功能,并自定义配置文件 META-INF/spring/xxx.imports

  2. 创建 dmybatis-spring-boot-starter 模块,在starter中引入自动配置模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/953194.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于扩频解扩+汉明编译码+交织的lora通信系统matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

针对服务器磁盘爆满,MySql数据库始终无法启动,怎么解决

&#xff08;点击即可进入聊天助手&#xff09; 很多站长在运营网站的过程当中都会遇到一个问题,就是网站突然无法打开,数据一直无法启动 无论是强制重启还是,删除网站内的所有应用,数据库一直无法启动 这个时候,就需要常见的运维手段了,需要对服务器后台各个资源,进行逐一排查…

LeetCode1170 比较字符串最小字母出现频次

字符串算法探秘&#xff1a;最小字母频次统计与比较问题剖析 在编程的世界里&#xff0c;字符串处理问题犹如繁星般繁多且各具特色。今天&#xff0c;我们聚焦于一道饶有趣味的题目&#xff0c;它涉及到对字符串中最小字母出现频次的统计以及基于此的比较操作。这道题不仅考验…

Kafka 分区管理

分区是主题的子集&#xff0c;每个主题可以被分割成多个分区&#xff0c;一个分区有一个主副本&#xff08;Leader&#xff09;及一个或多个从&#xff08;Follower&#xff09;副本。分区允许将数据分布在多个broker上&#xff0c;这样可以提高数据的处理能力、并行性及可靠性…

xcrun: error: invalid active developer path 解决

在拉取 github 代码时&#xff0c;提示如下报错&#xff1a; xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 原因是&#xff1a;这是由于 Xcode command line t…

2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…

Python 二次元初音未来桌宠

标题 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#xff0c;点个关注不迷路&…

vue3学习日记5 - 项目起步

最近发现职场前端用的框架大多为vue&#xff0c;所以最近也跟着黑马程序员vue3的课程进行学习&#xff0c;以下是我的学习记录 视频网址&#xff1a; Day2-11.项目起步-静态资源引入和ErrorLen安装_哔哩哔哩_bilibili 学习日记&#xff1a; vue3学习日记1 - 环境搭建-CSDN博…

【Linux系统】—— vim 的使用

【Linux系统】—— vim 的使用 1 vim 的基本概念2 vim 的多模式3 命令模式下的命令集3.1 进入/退出其他模式3.2 光标移动命令集3.3 复制/剪切/粘贴/删除命令集3.4 撤销命令集3.5 查找命令集3.6 替换命令集3.7 进入与退出替换模式 4 批量化编译5 底行模式6 vim 小技巧7 vim简单配…

JAVA实战开源项目:课程智能组卷系统(Vue+SpringBoot) 附源码

本文项目编号 T 009 &#xff0c;文末自助获取源码 \color{red}{T009&#xff0c;文末自助获取源码} T009&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 老…

了解 Ansys Mechanical 中的网格方法:综合指南

网格是每个有限元分析 &#xff08;FEA&#xff09; 仿真的支柱。它将几何图形划分为离散单元&#xff0c;使 Ansys Mechanical 能够近似模型在各种条件下的行为。结构良好的网格可确保准确、可靠和计算高效的结果&#xff0c;而结构不佳的网格可能会导致错误、收敛问题或不必要…

【Linux】深刻理解软硬链接

一.软硬链接操作 1.软连接 touch 创建一个文件file.txt &#xff0c;对该文件创建对应的软链接改怎么做呢&#xff1f; ln -s file.txt file-soft.link .给对应文件创建软连接。 软连接本质就是一个独立的文件&#xff0c;因为我们对应的软连接有独立的inode&#xff0c;他…

施耐德M241与MR30-FBS-MT 在Machine Expert V2.0的组态过程

一、系统概述 MR30分布式IO是一个高度灵活的可扩展分布式 I/O 系统&#xff0c;MR30-FBC-MT用于通过 Modbus TCP 总线将过程信号连接到上一级控制器。 具有以下特点&#xff1a; 结构紧凑 PUSH IN端子&#xff0c;易于安装&#xff0c;布线简单 灵活性高&#xff1a;开关量模…

大数据技术在服饰行业的应用

大数据技术的快速发展为各行各业带来了深刻的变革&#xff0c;本文将详细探讨大数据技术的发展脉络&#xff0c;大数据技术推动服饰企业的数字化转型&#xff0c;旨在为相关领域的研究和实践提供参考。 什么是大数据大数据技术的发展历程大数据在服饰行业的应用总结 1&#xff…

Vue2+OpenLayers添加/删除点、点击事件功能实现(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、安装Element-UI 四、代码实现 4.1、添加一个点 4.2、删除所有点 4.3、根据经纬度删除点 4.4、给点添加点击事件 4.5、完整代码 五、Gitee源码 一、案例截图 可以新增/删除标记点&#xff0c;点击标记点可以获取到当前标…

Windows 10 ARM工控主板连接I2S音频芯片

在Windows工控主板应用中&#xff0c;音频功能是一项基本的需求&#xff0c;USB声卡在x86/x64 Windows系统上就可直接免驱使用&#xff0c;但这些USB声卡通常不提供ARM上的Windows系统驱动。本文将介绍如何利用安装在ARM上的Windows工控主板——ESM8400的I2S接口、连接WM8960音…

【Rust】错误处理机制

目录 思维导图 引言 一、错误处理的重要性 1.1 软件中的错误普遍存在 1.2 编译时错误处理要求 二、错误的分类 2.1 可恢复错误&#xff08;Recoverable Errors&#xff09; 2.2 不可恢复错误&#xff08;Unrecoverable Errors&#xff09; 三、Rust 的错误处理机制 3…

提升租赁效率的租赁小程序全解析

内容概要 在如今快节奏的生活中&#xff0c;租赁小程序俨然成为了提升租赁效率的一把利器。无论是个人还是企业&#xff0c;都会因其便捷的功能而受益。简单来说&#xff0c;租赁小程序能让繁琐的租赁流程变得轻松、高效。在这里&#xff0c;我们将带您畅游租赁小程序的海洋&a…

SSM商城设计与实现

摘 要 本文的主要工作是对基于B/S模式及JSP技术的基于智能推荐的b2c销售网站进行了研究与设计。本文首先介绍了基于智能推荐的b2c销售网站的背景&#xff0c;分析比较了国内外相关基于智能推荐的b2c销售网站的运行模式、系统特点与开发技术。然后分析了目前热点的各种Web应用开…

drawDB docker部属

docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问&#xff1a;http://192.168.31.135:3000/