SpringBoot底层注解超详细介绍

目录
  • 1. @Configuration
  • 2. @bean
  • 3. @Import
  • 4. @Conditional条件装配
  • 5. 配置绑定
  • SpringBoot自动配置原理(源码分析)

1. @Configuration

—— 放在类前注释 用于表示配置类,配置类也是一个组件

@Configuration(proxyBeanMethods = true) // 配置类 == 配置文件
public class MyConfig {
}

通过 proxyBeanMethods 很好的解决了组件依赖的问题 ——

  • 只是注册组件,组件间无依赖(false)
  • 有组件依赖(true)

测试组件依赖及测试类本身是组件

		// 配置类本身也是一个组件
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);
        run.getBean("user01", User.class);
        run.getBean("tom", Pet.class);
        System.out.println("用户的宠物是不是容器中的宠物" + (user01.getPet() == tom01));

2. @bean

—— 放在方法前表示给容器中注册组件 (单实例)

注:目前我对容器、组件的理解有限, 后期如果有更深入的理解,会更新此处

    @Bean // 给容器中添加组件,方法名作为组件id, 返回类型是组件类型 , 返回的值是组件在容器中的实例
    public User user01(){
        User zangsan = new User("zangsan", 18);
        zangsan.setPet(tomcatPet());
        return zangsan;
    }

测试是否注册成功

		ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        // 查看容器里的组件
        String[] names = run.getBeanDefinitionNames();
        for(String s: names){
            System.out.println(s);
        }

3. @Import

—— 放在配置类前,用于导入组件

@Import({User.class, DBHelper.class}) // 给容器中自动创建出这两个类型的组件
@Configuration // 配置类 == 配置文件
public class MyConfig {
}

测试导入组件是否成功

DBHelper bean1 = run.getBean(DBHelper.class);

4. @Conditional条件装配

—— 用于注册组件需要特定条件的情况

例如: 用户需要宠物,若无宠物tom组件,不能注册用户组件

    @ConditionalOnBean(name = "tom") // 表示有 tom 组件才能注册 user01 组件
    @Bean // 给容器中添加组件,方法名作为组件id, 返回类型是组件类型 , 返回的值是组件在容器中的实例
    public User user01(){
        User zangsan = new User("zangsan", 18);
        zangsan.setPet(tomcatPet());
        return zangsan;
    }

测试

        System.out.println("容器中是否含有宠物组件" + run.containsBean("tom"));
        System.out.println("容器中是否含有用户组件" + run.containsBean("user01"));

5. 配置绑定

绑定核心配置文件 (application.properities)

方法一:

@Component // 将组件加到容器中
@ConfigurationProperties(prefix = "mycar") // 配置属性名

方法二:

// 功能一:开启Car的属性配置
// 功能二:把指定的组件导入容器中
@EnableConfigurationProperties(Car.class)

测试类:

    @Autowired
    Car car;
    @RequestMapping("/car")
    public  Car car(){
        System.out.println(car);
        return  car;
    }

SpringBoot自动配置原理(源码分析)

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration  // 当前是一个配置类
@EnableAutoConfiguration
@ComponentScan( // 指定扫描那些Spring注解
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

@EnableAutoConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage //——@Import({AutoConfigurationPackages.Registrar.class})
@Import({AutoConfigurationImportSelector.class})

核心注解1:

@AutoConfigurationPackage 利用Registrar给容器中批量注册组件

—— 将指定包下的组件批量导入 (MainAppliaction 包下)

核心注解2

@Import({AutoConfigurationImportSelector.class})

—— 利用 getAutoConfigurationEntry() 方法给容器中批量导入组件

配置类位置

总结: SpringBoot 所有自动配置全部加载, 按照条件装配 —— 导入相关场景才能生效

  • springboot 加载所有自动配置类, 按条件生效 —— 生效的配置类为容器中装配组件(默认绑定配置文件中的值)
  • 用户有自己配置的组件, 以用户的为先
  • 定制化配置 —— 自己替换底层组件 / 修改底层组件配置文件中的值

到此这篇关于SpringBoot底层注解超详细介绍的文章就介绍到这了,更多相关SpringBoot底层注解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解如何实现SpringBoot的底层注解

    一.@Configuration注解 1.基本使用 自定义配置类 /** * 1.@Configuration 告诉SpringBoot这是一个配置类,相当于一个xml配置文件 * * 2.配置类里面使用 @Bean 标注在方法上 来给容器注册组件,默认是单实例的 * * 3.配置类本身也是一个组件 */ @Configuration(proxyBeanMethods = true) public class MyConfig { @Bean public User user01(){ retu

  • SpringBoot2底层注解@Import用法详解

    目录 SpringBoot2注解@Import @Import 导入组件 用法 验证 SpringBoot2注解@Import 上一篇中了解到了@Configuration,可以注册组件.除此之外,还有许多注解也可以,用法跟之前学习 spring 的时候一样.比如,@Bean.@Component.@Controller.@Service.@Repository等. 这篇介绍另外一种给容器添加组件的方法:@Import注解,给容器中导入组件. @Import 导入组件 用法 @Import的用法

  • SpringBoot2底层注解@ConfigurationProperties配置绑定

    目录 配置绑定 验证 另一种方式 我们通常会把一些经常变动的东西放到配置文件里. 比如之前写在配置文件application.properties里的端口号server.port=8080,另外常见的还有数据库的连接信息等等. 那么,我的数据库连接信息放在配置文件里,我要使用的话肯定得去解析配置文件,解析出的内容在 bean 里面去使用. 整个场景其实就是把配置文件里的所有配置,绑定到 java bean 里面. 要完成这个场景,基于 java 原生代码编写还是有点麻烦的.通常会做一个封装,读取

  • 浅析SpringBoot2底层注解@Conditional@ImportResource

    目录 SpringBoot2底层注解 一.@ImportResource 示例 二.@ImportResource SpringBoot2底层注解 一.@ImportResource @Conditional注解,是根据条件进行装配.满足了 Conditional 指定的条件,就进行组件的注入. 另外@Conditional是个根注解,在idea里使用 ctrl+H 可以打开它的结构. 可以看到有许多的派生注解,每个注解都代表着一种功能.比如: @ConditionalOnBean:当容器中存在

  • SpringBoot2底层注解@Configuration配置类详解

    目录 SpringBoot2底层注解@Configuration配置类 一.配置类 二.配置类本身也是组件 三.proxyBeanMethods 属性 有组件依赖的场景 SpringBoot2底层注解@Configuration配置类 一.配置类 @Configuration这个注解作用就是告诉 springboot 这是一个配置类. 这个配置已经不陌生了,在之前 spring 相关的使用全注解方式时,就使用到了配置类. 在配置类里,可以使用@Bean标记在方法上,给容器注册组件,默认也是单实例

  • SpringBoot底层注解超详细介绍

    目录 1. @Configuration 2. @bean 3. @Import 4. @Conditional条件装配 5. 配置绑定 SpringBoot自动配置原理(源码分析) 1. @Configuration —— 放在类前注释 用于表示配置类,配置类也是一个组件 @Configuration(proxyBeanMethods = true) // 配置类 == 配置文件 public class MyConfig { } 通过 proxyBeanMethods 很好的解决了组件依赖的

  • SpringBoot整合MyBatis超详细教程

    1.整合MyBatis操作 前面一篇提到了SpringBoot整合基础的数据源JDBC.Druid操作,实际项目中更常用的还是MyBatis框架,而SpringBoot整合MyBatis进行CRUD也非常方便. 下面从配置模式.注解模式.混合模式三个方面进行说明MyBatis与SpringBoot的整合. 1.1.配置模式 MyBatis配置模式是指使用mybatis配置文件的方式与SpringBoot进行整合,相对应的就有mybatis-config.xml(用于配置驼峰命名,也可以省略这个文

  • SpringBoot整合Jackson超详细用法(附Jackson工具类)

    目录 一.Jackson简介 二.Json简介 三.springboot整合Jackson 1.创建项目 2.导入坐标 3.配置文件 4.实体类 5.测试类 一.Jackson简介 说明:本篇讲的是Jackson的详细用法,Jackson工具类在文章最后,直接复制粘贴即可使用. Jackson是公司中必用的组件之一,常用的还用阿里的Fastjson,但是由于一些原因bug与漏洞是在是太多,在注重安全的公司直接被pass,还有就是谷歌的Gson(这个没用过不太了解). Spring MVC 的默认

  • Spring @Autowired注解超详细示例

    目录 前言 一.依赖注入的方式 手动注入 自动装配 二.注解@Autowired的自动装配原理 @Autowired自动装配过程 实现原理 ①首先看看spring的源代码定义 ②核心逻辑在buildAutowiringMetadata中 ③InjectionMetadata类 ④ 实现注入逻辑 ⑤调用InjectionMetadata中的公共inject ⑥遍历调用protect的inject方法 前言 说明:我们今天要分享的是依赖注入(DI)通过自动装配的注解方式@Autowird注解方法的作

  • Jetpack Compose Canvas绘制超详细介绍

    目录 1. Canvas 2. 绘制方法 1. drawLine 2. drawRect 3. drawRoundRect 4. drawImage 5. drawCircle 6. drawArc 7. drawPath 8. drawPoints 3. DrawScope拓展方法 1. inset 2. translate 3. rotate与rotateRad 4. scale 5. clipRect 6. drawIntoCanvas 7. withTransform 4.参考 1. C

  • Android超详细介绍自定义多选框与点击按钮跳转界面的实现

    总程:在avtivity_main.xml设计5个控件,btn1-5,点击btn1弹出一个多选对话框,点击按钮btn1弹出一个多选框可选择你喜欢的打野英雄,点击btn2跳转到activity_main2界面(就是图片,不可选择)设计思路流程:在activity_main.xml布局界面,总体在头目录进行垂直排列,然后镶嵌5个水平的线性布局(左是ImageView,右边是Button按钮)由于5张图的大小在一个屏幕显示不出来,所以添加一个ScoveView滚动,以使所有资源可以看到! 在MainA

  • C语言 超详细介绍与实现线性表中的带头双向循环链表

    目录 一.本章重点 二.带头双向循环链表介绍 2.1什么是带头双向循环链表? 2.2最常用的两种链表结构 三.带头双向循环链表常用接口实现  3.1结构体创建 3.2带头双向循环链表的初始化  3.3创建新节点 3.4尾插 3.5打印链表 3.6头插 3.7尾删 3.8头删 3.9查找data(返回data的节点地址) 3.10在pos位置之前插入节点 3.11删除pos位置的节点 四.实现接口总结 五.在线oj训练与详解 一.本章重点 带头双向循环链表介绍 带头双向循环链表常用接口实现 实现接

  • C语言 超详细介绍与实现线性表中的无头单向非循环链表

    目录 一.本章重点 二.链表介绍 三.无头单向非循环链表常用接口实现 3.1动态申请一个节点 3.2单链表打印 3.3单链表尾插 3.4单链表的头插 3.5单链表的尾删 3.6单链表头删 3.7单链表查找 3.8单链表在pos位置之前插入x 3.9单链表删除pos位置的节点 四.在线oj训练 4.1移除链表元素(力扣) 4.2反转单链表(力扣) 一.本章重点 无头单向非循环链表介绍 无头单向非循环链表常用接口实现 在线oj训练 二.链表介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构

  • Java超详细介绍抽象类与接口的使用

    目录 1.抽象类的语法和特性 1.1语法 1.2特性 2.接口的语法和使用 2.1语法 2.2特性 1.抽象类的语法和特性 1.1语法 1.在Java中,一个类如果被abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体. // 抽象类:被abstract修饰的类 public abstract class Shape { // 抽象方法:被abstract修饰的方法,没有方法体 abstract public void draw()

  • Java超详细介绍封装与访问控制修符

    概念:我们在写入一个类的时候,为了保护里边的属性不被随意的调用这是我们可以使用特殊的修饰符进行相应的保护,而这样的话我们似乎只能在该类中调用使用了,出现某些特殊情况时就会无法发调用,虽然挺高了安全性但也降低了灵活性,这个时候我们的包装类就出现了,我们通过对某个方法的进行特殊方法的包装来对其进行相应的调用与赋值.就相当于银行为了保护财产会选择将金钱放进保险柜中来确保其的安全,但是当我们要取钱时,银行就要拿钥匙打开保险柜.修饰符相当于银行的保险柜,封装相当于保险柜的钥匙. 访问修饰符如下: 1) p

随机推荐