1.Spring容器加入对象方式简介

  • 使用XML配置文件

    • 在XML配置文件中使用< bean >标签来定义Bean,通过ClassPathXmlApplicationContext等容器来加载并初始化Bean。
  • 使用注解
    • 使用Spring提供的注解,例如@Component、@Service、@Controller、@Repository等注解来标识Bean
    • 然后通过@ComponentScan等注解扫描器来加载并初始化Bean。
  • 使用Java配置
    • 可以使用Java代码来配置Bean,例如使用@Configuration和@Bean注解来定义Bean
    • 然后通过AnnotationConfigApplicationContext等容器来加载并初始化Bean。
  • 使用Import注解
    • 使用@Import注解来引入其他配置类,然后通过容器加载并初始化Bean
    • @Import注解提供了三种用法
      • 直接Import导入
      • ImportSelector接口批量
      • ImportBeanDefinitionRegistrar条件注册

2.import注解导入Bean实操

(1)import注解简介

  • import注解是Spring框架中的一个注解,用于在一个配置类中引入其他配置类或者普通的Java类
  • 通过@Import注解,可以将其他配置类或者Java类中定义的Bean引入到当前配置类中
  • 默认的bean名称是【类全限定名,即包名+类名】

(2)import注解源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {Class<?>[] value();
}

(3)import案例实战

  • 创建汽车相关的接口以及类实体Bean
//汽车接口
public interface Car {}//奔驰类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BenChiCar implements Car{private String name = "奔驰汽车";
}//宝马类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaoMaCar implements Car{private String name = "宝马汽车";
}//奥迪类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AoDiCar implements Car{private String name = "奥迪汽车";
}
  • 创建配置类Manager
@Configuration
@Import(value = {BaoMaCar.class, AoDiCar.class, BenChiCar.class})
public class CarBeanManager {}
  • 主类测试
public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();//扫描指定的包,包括子包context.scan("com.lixiang");//里面完成初始化操作,核心方法context.refresh();Map<String, Car> beansOfType = context.getBeansOfType(Car.class);beansOfType.forEach((k,v)-> System.out.println(k+"="+v));}
}

3.ImportSelector批量导入Bean实操

(1)importSelector批量导入简介

  • ImportSelector 接口用于实现动态注册Bean的功能,【批量】导入对象到容器里,根据条件动态地选择需要注册的Bean,并加入Spring容器

  • 实现ImportSelector接口,这个接口的selectImports方法会返回一个String数组,数组中的值就是要添加的组件的全类名

(2)importSelector源码

public interface ImportSelector {//该方法的返回值是一个String数组,用于指定需要注册的Bean的类名。String[] selectImports(AnnotationMetadata importingClassMetadata);@Nullabledefault Predicate<String> getExclusionFilter() {return null;}
}

(3)案例实战

  • 我们还是用Car这几个实体Bean,批量导入到Spring容器,自定义选择器实现ImportSelector接口。
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {return new String[] {"com.lixiang.domain.AoDiCar","com.lixiang.domain.BaoMaCar","com.lixiang.domain.BenChiCar"};}
}
  • 在我们的Manager中修改import值
@Configuration
//只需要引入MyImportSelector即可
@Import(value = {MyImportSelector.class})
public class CarBeanManager {}
  • 主类测试
public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();//扫描指定的包,包括子包context.scan("com.lixiang");//里面完成初始化操作,核心方法context.refresh();Map<String, Car> beansOfType = context.getBeansOfType(Car.class);beansOfType.forEach((k,v)-> System.out.println(k+"="+v));}
}

4.BeanDefinitionRegistrar动态注册Bean实操

(1)ImportBeanDefinitionRegistrar接口简介

  • ImportBeanDefinitionRegistrar是Spring框架中的一个接口,用于实现动态注册Bean的功能
  • ImportBeanDefinitionRegistrar可以在运行时动态地向Spring容器中注册BeanDefinition
  • 与ImportSelector不同的是,ImportSelector只能返回需要注册的Bean的类名
  • 在使用@Import注解时,将实现ImportBeanDefinitionRegistrar接口的类引入到当前配置类中,实现动态注册Bean的功能

(2)ImportBeanDefinitionRegistrar源码

public interface ImportBeanDefinitionRegistrar {/*** @param importBeanNameGenerator * @param annotationMetadata 当前类的注解相关信息* @param registry IOC容器里面bean的注册信息*/default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,BeanNameGenerator importBeanNameGenerator) {registerBeanDefinitions(importingClassMetadata, registry);}/*** @param annotationMetadata 当前类的注解相关信息* @param registry IOC容器里面bean的注册信息*/default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {}}

(3)案例实战

  • 现在我们有一个场景,当宝马汽车、奥迪汽车、奔驰汽车都存在时,新创建一个新能源汽车
  • 创建新能源汽车主类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class NewEnergyCar implements Car{private String name = "新能源汽车";
}
  • 创建自定义的ImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {/*** 可以通过该方法进行手动注册*/boolean adCar = beanDefinitionRegistry.containsBeanDefinition("com.lixiang.domain.AoDiCar");boolean bmCar = beanDefinitionRegistry.containsBeanDefinition("com.lixiang.domain.BaoMaCar");boolean bcCar = beanDefinitionRegistry.containsBeanDefinition("com.lixiang.domain.BenChiCar");if (adCar && bmCar && bcCar){//IOC容器加个混合对象BeanDefinition beanDefinition = new RootBeanDefinition(NewEnergyCar.class);beanDefinitionRegistry.registerBeanDefinition("newEnergyCar",beanDefinition);}}
}
  • 配置Manager中import的值
@Configuration
@Import(value = {MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class CarBeanManager {}
  • 主类测试
public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();//扫描指定的包,包括子包context.scan("com.lixiang");//里面完成初始化操作,核心方法context.refresh();Map<String, Car> beansOfType = context.getBeansOfType(Car.class);beansOfType.forEach((k,v)-> System.out.println(k+"="+v));}
}

(4)BeanDefinition 介绍

  • Spring容器中最重要的概念之一,它是容器创建和管理Bean实例的基础,对Bean的定义信息的抽象和封装
  • 描述一个Bean的定义信息,包括Bean的名称、类型、作用域、属性等信息
  • 可以对Bean的创建和管理进行详细的配置和控制,例如可以指定Bean的作用域、是否懒加载、是否自动注入等属性

【框架源码】Spring源码底层IOC容器加入对象的方式相关推荐

  1. Spring(二)IOC容器的初始化流程

    文章目录 一.Spring 核心容器类 1.1 BeanFactory 1.2 ApplicationContext 1.3 BeanDefinition 二.IOC容器的初始化 2.1 基于Xml的 ...

  2. java框架注入是创建对象吗_spring之IOC容器创建对象

    1.术语了解 1.1组件/框架设计 侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:Struts框架 非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hi ...

  3. spring之:XmlWebApplicationContext作为Spring Web应用的IoC容器,实例化和加载Bean的过程...

    它既是 DispatcherServlet 的 (WebApplicationContext)默认策略,又是 ContextLoaderListener 创建 root WebApplicationC ...

  4. JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

    Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring?  Spring是分层的Java ...

  5. Spring(一)IOC容器详细笔记(算是详细吧)

    Spring 什么是Spring Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性.Spring 官网:https://spring.io/. 我们一般说 Spring ...

  6. Spring【二】IoC容器

    目录 一.组件.框架.容器 1.组件 2.框架 3.容器 二.JavaBean.POJO和EJB 1.JavaBean对象 2.POJO(简单Java对象) 3.EJB(企业级JavaBean) 三. ...

  7. Spring揭秘1:IOC容器、bean的生命周期

    1 依赖注入 在IoC模式中,被注入对象又是通过哪些方式来通知IoC Service Provider为其提供适当服务的呢?----依赖注入方式 构造方法注入 setter方法注入 接口注入 1.1 ...

  8. spring注入普通java类_普通java类如何取得注入spring Ioc容器的对象

    [除了使用XML配置外,还可以选择使用基于注解(annotation)的配置方式,其依赖于字节码来织入组件.注解注入在XML注入之前完成,因此在XML配置中可以重载注解注入的属性. 一.建一个Spri ...

  9. Spring是什么?IoC容器的理解

    1. Spring是什么? 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架)⽤⼀句话概括 Spring:Spring 是包含了众多⼯具⽅法的 IoC 容器. ...

最新文章

  1. 知识驱动的推荐系统:现状与展望
  2. 入门Qt——hello, world
  3. cmake + visual studio 配置出错的解决方法
  4. 启明智显分享| 关于ESP32-S3系列串口屏应用时配网需知
  5. 爬虫实战学习笔记_1 爬虫基础+HTTP原理
  6. 安卓案例:View动画 - 弹球碰壁
  7. 动漫美少女生成神器、猫的门禁...2019 年十七大最佳机器学习项目 | 年度盘点...
  8. java加载jdbc驱动,加载JDBC驱动
  9. [湖南集训] 谈笑风生
  10. 第四章 爬取西刺免费代理ip 并应用到scrapy
  11. 软件计算机考研考英语几,软件工程考研考哪几科
  12. 常见Excel技巧表
  13. 如何通过压缩视频软件,减少大小且画质无损技巧
  14. 如何选择一个合适的物联网模块
  15. opencv将整数像素图片转化为浮点型
  16. 在线工具:电脑怎么提取图片中的文字?图片如何转化为文字?
  17. cocos2d lua 环境搭建
  18. 前端 不同屏幕宽度 自适应布局 解决方案
  19. 经常性无法访问某些国内网站的问题(by quqi99)
  20. Web3.0入口-MPC钱包和智能合约钱包

热门文章

  1. SpaceVim猎奇
  2. 解读极限编程的十二大原则——代码共享
  3. OBD和WWH-OBD接口的外部测试设备的需求
  4. 思科、华为 GRE 隧道技术 的原理及配置详解
  5. 研究生与大学生的区别总结
  6. Mongodb时间类型转换
  7. 成功男士加微信炒期货_妙龄女微信化身“成功男士”卖“期货红酒”3个
  8. EasyNVR内网摄像机接入网关+EasyNVS云端管理平台,组件起一套轻量级类似于企业级萤石云的解决方案
  9. Spin lock 与mutex 的区别--2011.01.06
  10. 赛效:A4Word双面打印要多少钱?