广告
返回顶部
首页 > 资讯 > 后端开发 > Python >聊聊SpringBoot自动装配的魔力
  • 875
分享到

聊聊SpringBoot自动装配的魔力

2024-04-02 19:04:59 875人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、SpringBoot自动配置的好处1、回想一下当你在使用spring来搭建一个项目的时候2、这时我们会有一个疑问二、@Conditional注解相关介绍1、@Conditio

一、 springBoot自动配置的好处

1、 回想一下当你在使用spring来搭建一个项目的时候

你需要编写很多的有关spring的xml。例如读取属性配置的bean、数据源bean、事务管理工厂bean、mybatis与spring整个的bean等等。再次利用该框架搭建项目的时候,又是周而复始的操作。

但是现在当你使用springBoot搭建项目的时候,你会发现所有的配置你都不用去编写就可以帮你去实现(仅仅需要在连接外部数据库的时候需要进行配置,其实如果使用内嵌数据库h2 则你完全不必需要application.properties配置文件)。

你可以在你的具体的业务代码中使用@AutoWried @Resource注解将数据源,事务工厂等注入到业务层,像是你自己配置那样。

2、这时我们会有一个疑问

springBoot到底做了什么让我们可以不用配置,而使用那些功能对象。

其实springBoot使用基于条件的自动注入原理,即为当满足某个条件的时候,spring会实例化该注解对应的bean,将其放入到Srping上下文中,让你可以轻松的使用。SpringBoot实现条件配置离不开它的核心组件@Conditional。

下面我们慢慢的来揭开springBoot自动配置的神秘面纱。

二、@Conditional注解相关介绍

1、@Conditional小demo

@Conditional 是个什么鬼,不解释来个小的demo大致了解一下

描述一下demo场景 :Life实体bean在特定条件(@Conditional)下,被springBoot初始化,并放置到spring上下文环境中。

1.1、 Life 实体类



public class Life {
    //工作 
    private String work;
    //学习
    private String study
    //爱
    private String love;
 
  //省略seter /geter
 
}

1.2、 编写我们自己的条件匹配规则



public class MyTestConditional implements ConfigurationCondition {
    
    @Override
    public ConfigurationPhase getConfigurationPhase() {
        return ConfigurationPhase.REGISTER_BEAN;
    }
    
    @Override
    public boolean matches(ConditionContext conditionContext, 
    AnnotatedTypeMetadata annotatedTypeMetadata) {
              return false;  //表示验证不通过
    }

该类实现了ConfigurationCondition 有如下两个方法

1、 getConfigurationPhase() 该条件规则起作用的时候

2、 matches()条件匹配规则 这里为了演示不做具体的逻辑条件的处理

返回一个布尔值,如果为ture 则表示条件成立 配置生效

反之不生效。

1.3、编写我们的java实例bean自动配置


@Configuration
//@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,
// 作用为:配置spring容器(应用上下文)
public class ServerAutoConfiguration {
 
    @Configuration  //spring的xml配置文件中的<beans>
    //使用该注解表明,在springBoot启动的时候只有满足MyTestConditional.class 才生成对应的Life 对象
    //即 MyTestConditional中的match()返回true @Bean生效
    @Conditional(MyTestConditional.class)
    public static class StudentAutoConfiguration {
        @Bean
        public Life create() {
            System.out.println("life start....");
            return new Life("努力工作","不断的学习","敢爱敢恨");
        }
    }
}

1.4、 springBoot的单元测试


 
//使用Spring的单元测试环境
@RunWith(SpringRunner.class)
//将SpringBoot的上下文环境加载进入单元测试中
@SpringBootTest(classes = AutoApplication.class)
public class AutoApplicationTests {
   //注入springBoot 基于条件的实例化bean
   @Autowired
   private Life life;
   @Test
   public void showlife() {
      System.out.println("生命的全部:"+life.toString());
   }
}

启动springBoot项目,在控制台中没有发现Life对象被创建 且单元测试中无法注入Life

在修改了MyTestConditional中的match() 返回true 再次启动则Life对象被创建

同时使用SpringBoot的单元测试来使用springBoot为我们设置的Life实体

该实体创建流程如下:当springBoot项目启动的时候,会加载@Configuration(srping的xml配置)下的所有bean,当遇到@Conditional(MyTestConditional.class) 会调用该方法的Match,并根据其返回值来判断是否实例化该注解下的所有使用@Bean @Import 注解下的类

三、自定义一个条件配置类/springBoot自定义注解

1、简单解释@Condition注解家族

(1)、@Conditional

官方文档定义:

“Indicates that a component is only eligible for registration when all specified conditions match”

意思是只有满足一些列条件之后创建一个bean。 并注册到spring的上下文环境中

(2)、SpringBoot提供的

  • @ConditionalOnWEBApplication 该应用必须为web应用
  • @ConditionalOnMissingBean 该应用上下文中如果没有指定的bean
  • @ConditionalOnBean 该应用上下文中如果有指定的bean
  • @ConditionalOnProperty(name,value) 只有存在对应name的value的配置文件才加载该注解下的bean
  • @ConditionalOnCloudPlatfORM 匹配当处于云平台环境中时后
  • @ConditionalOnClass 该classpath中如果有指定的bean @ConditionalOnExpression 如果对应的表达式成立 成功
  • @ConditionalOnJava 根据应用程序运行的JVM版本进行匹配 成功
  • @ConditionalOnRepositoryType 当特定类型的spring Data JPA启用的时候 成功
  • @ConditionalOnSingleCandidate 当特定的class对应的bean存在且唯一确定的时候
  • @ConditionalOnJndi 通过JNDI查找制定的条件
  • @Profile 通过特定的条件触发 (生产环境使用该配置,非生产环境则不是使用)
  • @ConditionalOnResource 从资源文件中查询
  • @ConditionalOnEnabledResourceChain 从资源链中中查询
  • @ConditionalOnNotWebApplication 如果改应用不是web应用,则该条件起作用
  • @ConditionalOnMissinGClass 如果不存在对应的class则创建该对应的bean

满足条件后则加载该注解作用下的类起作用

(3)、所谓该注解作用下的类起作用是指

这些注解都有如下两种使用方式

1、作用在类上,则该类下的所有@Bean注解起作用 (条件成立,加载该注解下的所有@Bean的实体类 存放在spring上下文中)

2、作用在方法上 则该方法下对应的@bean注解起作用 (条件成立,加载该注解下使用@Bean的实体类 存放在spring上下文中)

与@Configuration或者@Bean配合使用,当和@Configuration配合使用时,

那么该类下所有@Bean方法 或者@Import 或者 @ComponentScan都会受到其配置条件的影响

  • @Configuration 相当于spring的xml配置文件的<beans>标签
  • @Bean 注解相当于spring的xml配置文件的<bean>标签
  • @Import(Xxx.class)将指定的class 实例注入到spring的上下文中
  • @Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文)

2、自定义条件注解

结合demo 来设置一个自定义注解

(1)、 自定义注解



@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyTestConditional.class)
public @interface ConditionalOnLife {
    Class<?>[] value() default {};
    String[] name() default {};}

(2)、进行配置使用


@Configuration  //spring的xml配置文件中的<beans>
//使用该注解表明,在springBoot启动的时候只有满足MyTestConditional.class 才生成对应的Life 对象
//自定义的条件注解
@ConditionalOnLife
//@Conditional(MyTestConditional.class)
public static class DreamAutoConfiguration {
    @Bean
    public Dream createDream() {
        //life.toString();
        System.out.println("dream start....");
        return new Dream();
    }
}

后台调用成功创建了Dream实体 并放入spring上下文环境中

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 聊聊SpringBoot自动装配的魔力

本文链接: https://www.lsjlt.com/news/157558.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 聊聊SpringBoot自动装配的魔力
    目录一、springBoot自动配置的好处1、回想一下当你在使用spring来搭建一个项目的时候2、这时我们会有一个疑问二、@Conditional注解相关介绍1、@Conditio...
    99+
    2022-11-12
  • 聊聊SpringBoot整合Nacos自动刷新配置的问题
    目录目的环境pom配置文件代码日志测试目的 Nacos作为SpringBoot服务的注册中心和配置中心。 在NacosServer中修改配置文件,在SpringBoot不重启的情况下...
    99+
    2022-11-13
  • springBoot的自动装配
    springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理。 它的原理: 1,注解 @SpringBootA...
    99+
    2023-09-13
    spring boot spring java
  • 浅析SpringBoot自动装配的实现
    目录背景解析起始具体解析结论备注背景 众所周知,如下即可启动一个最简单的Spring应用。查看@SpringBootApplication注解的源码,发现这个注解上有一个重要的注解@...
    99+
    2022-11-13
  • springboot 无法自动装配的问题
    目录springboot 无法自动装配@Autowired 报错:无法自动装配基本上是因为放到org.example下,问题解决原因无法自动装配。未找到“xxxMappe...
    99+
    2022-11-13
  • SpringBoot自动装配Condition的实现方式
    目录1. 简介2. 定义2.1 @Conditional2.2 Condition3. 使用说明3.1 创建项目3.2 测试3.3 小结4. 改进4.1 创建注解4.2 修改User...
    99+
    2022-11-12
  • SpringBoot自动装配的原理与使用
    目录引言1. 什么是自动装配2. Spring Boot 中的自动装配原理2.1自动装配流程2.2原理2.2.1 @Qualifier2.2.2 @Value2.2.3 @Prima...
    99+
    2023-05-20
    Springboot自动装配原理 Springboot自动装配
  • SpringBoot自动装配的优点有哪些
    本篇内容介绍了“SpringBoot自动装配的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、 springBoot自动配置的好...
    99+
    2023-06-25
  • SpringBoot自动装配的原理详解分析
    目录前言自动装配案例自动装配分析自动装配总结前言 关于 ​​SpringBoot​​​ 的自动装配功能,相信是每一个 ​​Java​​ 程序员...
    99+
    2022-11-13
    SpringBoot 自动装配原理 SpringBoot 自动装配
  • springboot自动装配的源码与流程图
    前言 在使用SpringBoot开发项目中,遇到一些 XXX-XXX-starter,例如mybatis-plus-boot-starter,这些包总是能够自动进行配置, 减少了开...
    99+
    2022-11-12
  • SpringBoot依赖管理和自动装配的方法
    这篇文章主要介绍了SpringBoot依赖管理和自动装配的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot依赖管理和自动装配的方法文章都会有所收获,下面我们一起来看看吧。1.1依赖管理父项...
    99+
    2023-06-29
  • Springboot自动装配之注入DispatcherServlet的实现方法
    原理概述 Springboot向外界提供web服务,底层依赖了springframework中的web模块(包含但不限于spring mvc核心类DispatcherServlet)...
    99+
    2022-11-13
  • SpringBoot中怎么自动装配Condition的实现方式
    这篇文章将为大家详细讲解有关SpringBoot中怎么自动装配Condition的实现方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 简介@Conditional注解在Spring4...
    99+
    2023-06-20
  • springboot无法自动装配的问题怎么解决
    本篇文章为大家展示了springboot无法自动装配的问题怎么解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。springboot 无法自动装配@Autowired 报错:无法自动装配基本上是因为...
    99+
    2023-06-26
  • 浅谈SpringBoot实现自动装配的方法原理
    目录1. 什么是自动装配2. 自动装配的原理3. 自动装配的步骤4. 自定义自动配置5.代码案例总结1. 什么是自动装配 在传统的Spring框架中,我们需要手动配置和管理Bean的...
    99+
    2023-05-20
    SpringBoot实现自动装配 SpringBoot自动装配
  • SpringBoot自动装配原理的知识点有哪些
    这篇文章主要介绍“SpringBoot自动装配原理的知识点有哪些”,在日常操作中,相信很多人在SpringBoot自动装配原理的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot自...
    99+
    2023-06-08
  • SpringBoot(cloud)自动装配bean找不到类型的问题
    目录SpringBoot自动装配bean找不到类型今天我就犯了因为boot扫不到包的问题看项目结构很明显无法自动装配。未找到“xxxMapper”类型的bea...
    99+
    2022-11-13
  • 最新springboot中必须要了解的自动装配原理
    目录1.pom.xml2.启动器3.主程序3.1注解3.2 spring.factories4. 结论1.pom.xml 父 依 赖 \textcolor{orange}{父依赖} ...
    99+
    2022-11-13
  • 怎么解决SpringBoot自动装配bean找不到类型的问题
    这篇文章主要介绍“怎么解决SpringBoot自动装配bean找不到类型的问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么解决SpringBoot自动装配bean找不到类型的问题”文章能帮助大...
    99+
    2023-06-29
  • 基于SpringBoot实现自动装配返回属性的设计思路
    目录一:需求背景二:设计思路三:使用方法四:注解解析器(核心代码)五:需要思考的技术点一:需求背景 在业务开发中经常会有这个一个场景,A(业务表)表中会记录数据的创建人,通常我们会用...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作