当前位置: 首页 > news >正文

SpringBoot自动配置

自动配置:

  是指在SpringBoot应用启动时,可以把一些配置类自动注入到Spring的IOC容器中,项目运行时可以直接使用这些配置类的属性。

  首先,在 pom.xml 中引入 Spring Boot 的依赖,例如

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
@SpringBootApplication
public class SpringBootStart01Application {public static void main(String[] args) {SpringApplication.run(SpringBootStart01Application.class, args);}
}

一.Condition
在 Spring 的 IOC 容器中有一个 User 的 Bean,现要求:导入Jedis坐标后,加载该Bean,没导入,则不加载。

实现步骤:

① 定义条件类:自定义类实现Condition接口,重写 matches 方法,在 matches 方法中进行逻辑判断,返回 boolean值 。 matches 方法两个参数:

• context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。

• metadata:元数据对象,用于获取注解属性。

② 判断条件: 在初始化Bean时,使用 @Conditional(条件类.class)注解

SpringBoot 提供的常用条件注解:

一下注解在springBoot-autoconfigure的condition包下

ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean ConditionalOnBean:判断环境中有对应Bean才初始化Bean

@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {boolean flag = true;try {Class<?> cls = Class.forName("redis.clients.jedis.Jedis");} catch (ClassNotFoundException e) {flag = false;}return flag;}

测试:@SpringBootApplication
public class SpringbootCondition01Application {public static void main(String[] args) {ConfigurableApplicationContext context =  SpringApplication.run(SpringbootCondition01Application.class, args);Object user = context.getBean("user");System.out.println(user);}


在 Spring 的 IOC 容器中有一个 User 的Bean,现要求: 将类的判断定义为动态的

实现步骤:

不使用@Conditional(ClassCondition.class)注解,自定义注解@ConditionOnClass,因为他和之前@Conditional注解功能一致,所以直接复制编写ClassCondition中的matches方法

 自定义注解@ConditionOnClass:

public class ClassCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {//2.需求: 导入通过注解属性值value指定坐标后创建Bean//获取注解属性值  valueMap<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());System.out.println(map);String[] value = (String[]) map.get("value");boolean flag = true;try {for (String className : value) {Class<?> cls = Class.forName(className);}} catch (ClassNotFoundException e) {flag = false;}return flag;}
}
测试:
@SpringBootApplication
public class SpringbootCondition02Application {public static void main(String[] args) {//启动SpringBoot的应用,返回Spring的IOC容器ConfigurableApplicationContext context =  SpringApplication.run(SpringbootCondition02Application.class, args);Object user2 = context.getBean("user2");System.out.println(user2);}
}

二、@Eable注解

1.首先使用 Spring Initializr 来快速创建好一个Maven项目。这是子项目,在子项目里写相关功能类。

2.然后在父项目的 pom.xml 里面声明该父项目包含的子模块。(其它信息就不逐一讲述了,诸如继承SpringBoot官方父项目以及统一依赖管理)

@Enable底层依赖于@Import注解导入一些类,使用@Import导入的类会被Spring加载到IOC容器中。

代码如下:

@SpringBootApplication
@Import(User.class)
public class Enable01Application {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(Enable01Application.class, args);//获取BeanUser user = context.getBean(User.class);System.out.println(user);}
}
测试:
@SpringBootApplication
@Import(UserConfig.class)
public class Enable01Application {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(Enable01Application.class, args);//获取BeanUser user = context.getBean(User.class);System.out.println(user);}
}

三、@EnableAutoConfiguration注解

@SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用

@SpringBootApplication是一个复合注解,其中包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan注解

1.@ComponentScan

这个注解在Spring中很重要 ,它对应XML配置中的元素。

作用:自动扫描

2.@SpringBootConfiguration

作用:SpringBoot的配置类 ,标注在某个类上 , 表示这是一个SpringBoot的配置类;

3.@EnableAutoConfiguration开启自动配置功能

@EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class) 来加载配置类。
配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean
并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vscode 远程免密登录
  • springCloudAlibaba整合log4j2
  • react中使用nextjs框架,前端调后端接口跨域解决方式
  • 从0开始搭建vue + flask 旅游景点数据分析系统(十一):登录、注册页面、未登录拦截、注销逻辑
  • 信息学奥赛一本通1259:【例9.3】求最长不下降序列
  • 浙大数据结构慕课课后题(04-树6 Complete Binary Search Tree)
  • linux上常见问题
  • 基于深度学习的迁移学习
  • 克服编程学习中的挫败感,收获满满的成就感
  • 打造智能工厂:基于嵌入式 C++、Qt/QML 和 MQTT 的车间设备远程监控系统(代码示例)
  • Qt —— 创建 hello world
  • STM32标准库学习笔记-4.定时器中断
  • 前端css动画transform多个属性值写法
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • 象棋布局笔记
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Angular 响应式表单 基础例子
  • Java 23种设计模式 之单例模式 7种实现方式
  • Vue2.0 实现互斥
  • windows下使用nginx调试简介
  • 将 Measurements 和 Units 应用到物理学
  • 聚簇索引和非聚簇索引
  • 利用jquery编写加法运算验证码
  • 你不可错过的前端面试题(一)
  • 前端临床手札——文件上传
  • 如何合理的规划jvm性能调优
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 深度解析利用ES6进行Promise封装总结
  • 深入浅出Node.js
  • 通过几道题目学习二叉搜索树
  • 微服务核心架构梳理
  • 一文看透浏览器架构
  • 正则学习笔记
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • # .NET Framework中使用命名管道进行进程间通信
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (70min)字节暑假实习二面(已挂)
  • (C#)一个最简单的链表类
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (四)图像的%2线性拉伸
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)jdk与jre的区别
  • (转载)OpenStack Hacker养成指南
  • ****三次握手和四次挥手
  • .NET NPOI导出Excel详解
  • .Net Winform开发笔记(一)
  • .NET单元测试
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net开发引用程序集提示没有强名称的解决办法
  • .sh
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器