【框架源码】Spring源码底层IOC容器加入对象的方式
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容器加入对象的方式相关推荐
- Spring(二)IOC容器的初始化流程
文章目录 一.Spring 核心容器类 1.1 BeanFactory 1.2 ApplicationContext 1.3 BeanDefinition 二.IOC容器的初始化 2.1 基于Xml的 ...
- java框架注入是创建对象吗_spring之IOC容器创建对象
1.术语了解 1.1组件/框架设计 侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:Struts框架 非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hi ...
- spring之:XmlWebApplicationContext作为Spring Web应用的IoC容器,实例化和加载Bean的过程...
它既是 DispatcherServlet 的 (WebApplicationContext)默认策略,又是 ContextLoaderListener 创建 root WebApplicationC ...
- JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试
Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的Java ...
- Spring(一)IOC容器详细笔记(算是详细吧)
Spring 什么是Spring Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性.Spring 官网:https://spring.io/. 我们一般说 Spring ...
- Spring【二】IoC容器
目录 一.组件.框架.容器 1.组件 2.框架 3.容器 二.JavaBean.POJO和EJB 1.JavaBean对象 2.POJO(简单Java对象) 3.EJB(企业级JavaBean) 三. ...
- Spring揭秘1:IOC容器、bean的生命周期
1 依赖注入 在IoC模式中,被注入对象又是通过哪些方式来通知IoC Service Provider为其提供适当服务的呢?----依赖注入方式 构造方法注入 setter方法注入 接口注入 1.1 ...
- spring注入普通java类_普通java类如何取得注入spring Ioc容器的对象
[除了使用XML配置外,还可以选择使用基于注解(annotation)的配置方式,其依赖于字节码来织入组件.注解注入在XML注入之前完成,因此在XML配置中可以重载注解注入的属性. 一.建一个Spri ...
- Spring是什么?IoC容器的理解
1. Spring是什么? 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架)⽤⼀句话概括 Spring:Spring 是包含了众多⼯具⽅法的 IoC 容器. ...
最新文章
- 知识驱动的推荐系统:现状与展望
- 入门Qt——hello, world
- cmake + visual studio 配置出错的解决方法
- 启明智显分享| 关于ESP32-S3系列串口屏应用时配网需知
- 爬虫实战学习笔记_1 爬虫基础+HTTP原理
- 安卓案例:View动画 - 弹球碰壁
- 动漫美少女生成神器、猫的门禁...2019 年十七大最佳机器学习项目 | 年度盘点...
- java加载jdbc驱动,加载JDBC驱动
- [湖南集训] 谈笑风生
- 第四章 爬取西刺免费代理ip 并应用到scrapy
- 软件计算机考研考英语几,软件工程考研考哪几科
- 常见Excel技巧表
- 如何通过压缩视频软件,减少大小且画质无损技巧
- 如何选择一个合适的物联网模块
- opencv将整数像素图片转化为浮点型
- 在线工具:电脑怎么提取图片中的文字?图片如何转化为文字?
- cocos2d lua 环境搭建
- 前端 不同屏幕宽度 自适应布局 解决方案
- 经常性无法访问某些国内网站的问题(by quqi99)
- Web3.0入口-MPC钱包和智能合约钱包
热门文章
- SpaceVim猎奇
- 解读极限编程的十二大原则——代码共享
- OBD和WWH-OBD接口的外部测试设备的需求
- 思科、华为 GRE 隧道技术 的原理及配置详解
- 研究生与大学生的区别总结
- Mongodb时间类型转换
- 成功男士加微信炒期货_妙龄女微信化身“成功男士”卖“期货红酒”3个
- EasyNVR内网摄像机接入网关+EasyNVS云端管理平台,组件起一套轻量级类似于企业级萤石云的解决方案
- Spin lock 与mutex 的区别--2011.01.06
- 赛效:A4Word双面打印要多少钱?