目录
@Configuration 注解的概述底层原理与 Spring IoC 容器的集成Bean 的定义和装配的实现条件化配置的实现配置类的加载和实例化过程总结Spring 提供了丰富的特性和功能,包括依赖注入、面向切面编程、事务管理、数据访问、Web应用程序开发等。其中,@Configuration 是 Spring 中的一个注解,它用于标记一个类为配置类,通过配置类可以定义和组装 Spring Bean,并且支持高度灵活的配置方式。在本文中,我们将深入探讨 @Configuration 注解的底层原理,包括其与 Spring IoC 容器的集成、其对 Bean 的定义和装配的实现,以及其在 Spring 框架中的作用和用法。
(资料图片)
@Configuration 注解的概述
@Configuration 注解是 Spring 3.0 版本引入的新特性,它用于将一个类标记为配置类,通过配置类可以定义和组装 Spring Bean。
配置类是一个普通的 Java 类,但是在类级别上添加了 @Configuration 注解,表明这个类用于配置 Spring Bean 的创建和管理。配置类可以包含多个用于定义 Bean 的方法,这些方法使用 @Bean 注解来标记,并且返回一个对象,该对象会被 Spring IoC 容器管理。
配置类可以通过多种方式创建和组装 Bean,包括使用其他配置类的 Bean、通过依赖注入注入其他 Bean、通过条件注解实现 Bean 的条件化创建等。配置类可以在 XML 配置文件、JavaConfig 类、注解等方式中进行定义,使得 Spring 的配置更加灵活和方便。
@Configuration 注解的主要作用有以下几点:
定义 Bean:通过在配置类中使用 @Bean 注解,可以定义和组装 Bean,并将其纳入 Spring IoC 容器的管理,从而使得这些 Bean 可以在应用程序中被使用。
管理依赖关系:配置类可以通过依赖注入的方式引入其他 Bean,从而实现 Bean 之间的依赖关系管理。这样,当创建一个 Bean 时,其依赖的其他 Bean 会被自动注入,从而方便地管理 Bean 之间的依赖关系。
提供条件化配置:配置类可以通过条件注解实现 Bean 的条件化创建,从而根据不同的条件创建不同的 Bean。这可以用于根据环境、配置等动态地选择 Bean 的创建方式,使得配置更加灵活。
底层原理
@Configuration 注解的底层原理主要包括以下几个方面的内容:与 Spring IoC 容器的集成、Bean 的定义和装配的实现、条件化配置的实现、以及配置类的加载和实例化过程。
与 Spring IoC 容器的集成
@Configuration 注解与 Spring IoC 容器的集成是通过 ConfigurationClassPostProcessor 类来实现的。ConfigurationClassPostProcessor 是一个 Bean 后置处理器,它负责处理标记了 @Configuration 注解的配置类,并将其转换为 Bean 定义并注册到 Spring IoC 容器中。
ConfigurationClassPostProcessor 的处理过程分为三个阶段:
解析阶段:ConfigurationClassPostProcessor 会扫描配置类的类级别上的 @Configuration 注解,并解析其中的 Bean 定义和依赖关系,生成相应的 BeanDefinition 对象。
注册阶段:ConfigurationClassPostProcessor 将解析得到的 BeanDefinition 对象注册到 Spring IoC 容器中,成为真正的 Spring Bean。
验证阶段:ConfigurationClassPostProcessor 会验证配置类中的 Bean 定义和依赖关系是否正确,如果有错误则会抛出异常。
通过 ConfigurationClassPostProcessor 的处理,@Configuration 注解标记的配置类会被解析成真正的 BeanDefinition 对象,并注册到 Spring IoC 容器中,从而使得这些配置类中定义的 Bean 可以被 Spring 容器管理和使用。
Bean 的定义和装配的实现
@Configuration 注解标记的配置类中,可以使用 @Bean 注解来定义 Bean,并将其纳入 Spring IoC 容器的管理。@Bean 注解的底层实现主要通过BeanMethod类来实现。
BeanMethod类是一个内部类,它表示一个配置类中使用 @Bean 注解定义的方法。每个使用 @Bean 注解的方法都会被 BeanMethod 类表示,并包含相应的 Bean 定义信息,例如 Bean 的名称、类型、作用域、初始化方法、销毁方法等。
在解析阶段,ConfigurationClassPostProcessor 会扫描配置类中的 @Bean 注解,解析其中的 Bean 定义信息,并将其封装成 BeanMethod 对象。在注册阶段,ConfigurationClassPostProcessor 会根据 BeanMethod 对象创建相应的 BeanDefinition 对象,并注册到 Spring IoC 容器中。
在装配阶段,当需要获取一个使用 @Bean 注解定义的 Bean 时,Spring IoC 容器会通过调用相应的 BeanMethod 对象的方法来创建 Bean 的实例。这样,@Bean 注解的配置类中定义的 Bean 就可以被自动创建和装配到其他 Bean 中,实现了依赖注入的功能。
条件化配置的实现
@Configuration 注解支持条件化配置,即根据不同的条件来判断是否加载某个配置类或者创建某个 Bean。这个功能的底层实现主要依赖于 Condition 接口和 ConditionContext、AnnotatedTypeMetadata两个接口的实现。
Condition接口定义了一个 matches 方法,用于判断是否满足条件。当某个配置类或者 Bean 使用了 @Conditional 注解,并传入了一个实现了 Condition 接口的类时,Spring IoC 容器会在解析阶段调用这个 Condition 类的 matches 方法来判断是否满足条件。如果满足条件,那么这个配置类或者 Bean 就会被加载或者创建,否则就会被忽略。
ConditionContext 和 AnnotatedTypeMetadata接口分别用于在 Condition 接口的 matches 方法中获取当前的上下文信息和注解元数据。ConditionContext 提供了获取 BeanFactory、Environment、ResourceLoader、ClassLoader 等信息的方法,可以用于判断当前环境的状态。AnnotatedTypeMetadata 则提供了获取配置类或者 Bean 的注解信息的方法,可以用于判断注解的属性值是否满足条件。
通过这些接口的实现,@Conditional 注解的配置类或者 Bean 可以根据不同的条件来进行动态加载或者创建,从而实现了条件化配置的功能。
配置类的加载和实例化过程
@Configuration 注解标记的配置类在 Spring IoC 容器中的加载和实例化过程主要包括以下几个步骤:
加载配置类:当 Spring IoC 容器启动时,会扫描所有的配置类,并将其加载到容器中。这个过程是通过 ConfigurationClassParser 类来实现的。
ConfigurationClassParser 类负责解析配置类中的注解,包括 @Configuration、@Bean、@ComponentScan 等注解,并生成相应的 BeanDefinition 对象。其中,@ComponentScan 注解用于指定需要扫描的包,从而找到其他的配置类和 Bean 定义。
解析 Bean 定义和依赖关系:在加载配置类的过程中,ConfigurationClassParser 会解析配置类中的 @Bean 注解,并生成相应的 BeanDefinition 对象。同时,它还会解析配置类中的其他注解,例如 @Autowired、@Value 等注解,从而生成 Bean 之间的依赖关系。
注册 Bean 定义:在解析完 Bean 定义和依赖关系后,ConfigurationClassParser 会将生成的 BeanDefinition 对象注册到 Spring IoC 容器中。这个过程是通过调用 BeanDefinitionRegistry 接口的 registerBeanDefinition 方法来实现的。
实例化 Bean:当需要获取某个 Bean 时,Spring IoC 容器会根据 Bean 的定义信息,实例化 Bean 并将其放入容器中。这个过程是通过调用 BeanFactory 接口的 getBean 方法来实现的。
在实例化 Bean 的过程中,Spring IoC 容器会先判断 Bean 是否已经存在于容器中。如果存在,则直接返回已经存在的 Bean 实例;如果不存在,则会通过 Bean 的定义信息来创建新的 Bean 实例。
在创建Bean实例时,Spring IoC 容器会先检查 Bean 的构造函数是否有参数。如果有参数,则会按照参数类型或者参数名来从容器中获取对应的 Bean 实例,并传入构造函数中。如果没有参数,则直接调用无参构造函数来创建 Bean 实例。
创建Bean实例后,Spring IoC 容器会对 Bean 进行初始化,包括调用 Bean 的初始化方法(例如 @PostConstruct 注解标记的方法)、应用 Bean 的属性值(例如 @Value 注解标记的属性)、处理 Bean 的生命周期回调(例如 InitializingBean 和 DisposableBean 接口的实现)等。
最后,创建完成的 Bean 实例会被放入容器中,并可以通过 Bean 的名称或者类型来进行访问和使用。
总结
@Configuration 注解是 Spring 框架中用于标记配置类的重要注解之一。它允许我们通过 Java 类的方式来配置和管理 Bean 实例,从而实现了面向对象的配置方式。
@Configuration 注解的底层原理涉及到了代理对象、循环依赖解决方案、刷新机制、条件化配置等多个方面。通过深入理解 @Configuration 注解的原理,我们可以更好地理解 Spring 框架中的配置方式,并在实际项目中灵活地应用。
在使用 @Configuration 注解时,需要注意一些常见的使用原则,例如避免在配置类中使用 @Autowired 注解、避免循环依赖、合理使用条件化配置等。同时,深入了解 @Configuration 注解的源码实现,对于排查和解决配置相关的问题也是非常有帮助的。
以上就是详解Spring注解 @Configuration的详细内容,更多关于pring注解 @Configuration的资料请关注脚本之家其它相关文章!
标签:
- 详解Spring注解 @Configuration
- 【环球热闻】鲁j58888 车牌鲁jjj818这个号牌好吗
- 日本陆上自卫队:第8师团长坂本雄一已被确认死亡
- q8300cpu参数配置 q8300cpu参数
- 今日看点:三国志英杰传吞食天地1金手指 吞食天地1金手指
- 环球讯息:芭诗丽祛红印是真的吗 芭诗丽
- 环球今头条!七喜笔记本电脑官网 七喜电脑官网
- 世界即时看!深圳数据交易所与蚂蚁集团合作 共同探索数据交易新范式
- 全球快资讯:长春科技学院怎么样学费多少_长春科技学院怎么样
- 环球热点!库里从低谷到巅峰的路途:蝴蝶与独角兽
- 即时焦点:4月21日外汇市场行情走势分析:尽管欧元区商业活动有所改善,但欧元/美元仍无精打采
- 世界要闻:2023宁夏中卫市(第一批)事业单位自主招聘部分岗位取消、核减及降低面试开考比例公告
- 砍45分!蒙蒂赞布克:这是他一直在做的事 他是球队的“恒温器”
- 全球信息:4月21日基金净值:博时鑫泽灵活配置混合A最新净值2.055,跌1.91%
- 环球滚动:4月21日基金净值:工银优质精选混合A最新净值3.19,跌1.42%
- 当前要闻:小龙虾炸一遍还是两遍好吃(小龙虾哪些部位不能吃除了虾线)
- 焦点观察:财税2016年12号文件还有效吗_财税2016年12号文件
- 环球热消息:竹叶贷逾期会起诉我吗
- 每日观察!广佳建设2022年亏损1404.42万同比亏损减少 有效控制项目成本使公司毛利率提升
- 【当前独家】山西省2023年(2022级夏季)普通高中学业水平合格性考试报名公告
- 每日看点!分析一份计划书(分析一份计划书简单)
- 全球速递!融资成本稳中有降信贷结构持续优化 不存在长期通缩或通胀基础
- spf50和pa++++是什么意思(spf30和spf50的区别)
- 全球最新:汽车铭牌在车的什么位置_汽车铭牌在什么位置
- 洛克王国暗影守护 洛克王国花影守护者在哪里
- 今日关注:坏蛋是怎样炼成的3六道新书 坏蛋是怎样炼成的3六道
- 焦点速讯:医用同位素是什么_同位素扫描是什么检查
- 一个女一个后念什么 女后念什么
- 看点:海贼王小八合集 海贼王小八
- 推动高质量学区集团办学 普陀区首推支持“政策包”
- 快看:直播电视在线观看湖南卫视 在线直播湖南卫视直播
- 焦点快看:央行依法处罚2家拒收人民币现金单位
- 今日视点:樱桃树一年开几次花_樱桃树一年开多少次花和花期多长时间呢
- 焦点速讯:上海土拍第四日:万科联合中铁建75.49亿元落子闵行梅陇板块
- 环球即时:英 雄 联 盟 英联盟雄
- 易烊千玺姓什么洗澡 易烊千玺姓什么
- 世界看点:帝勃伟戈 勃威帝多少钱一盒
- 【全球速看料】葫芦丝音乐论坛婚誓 葫芦丝音乐论坛
- 世界快资讯丨央行依法处罚2家拒收人民币现金单位
- 环球观速讯丨情书1000字写给女朋友 黄文煜女朋友
- 中国累计建成5G基站逾264万个
- 每日讯息!理工导航(688282)龙虎榜数据(04-21)
- 每日视讯:海上日出巴金原文 海上日出巴金
- 【全球聚看点】高等教育阶段“奖贷助补免勤”资助体系已形成
- 【全球报资讯】李小玢的第一任丈夫 李小玢的丈夫
- 每日速读!世运电路4月21日盘中跌幅达5%
- 即时:死神vs火影蓝染技能表数字 死神vs火影蓝染技能表
- 穿越火线小说生化入侵 穿越火线邪恶小说
- 告诉自己忘了他在线听 告诉自己忘了他
- 国家疾控局回应XBB.1.16流行情况:未形成传播优势
- 【焦点热闻】日本小笠原群岛附近海域发生5.6级地震
- 泸州市加强网络安全专题培训 不断提高网络安全能力
- 泸州市社科联(院)组织召开市级哲学社会科学重点研究基地2023年度工作座谈会
- 小松彩下 小松彩夏为何不火
- 环球消息!高等教育阶段“奖贷助补免勤”资助体系已形成
- 世界热议:5次!德赫亚是自上赛季以来失误导致丢球次数最多的英超门将
- 鸭子视频ios 鸭子a永久地址
- 全球新资讯:国家疾控局回应XBB.1.16流行情况:未形成传播优势
- 和祖国一起成长绘画图片 和祖国一起成长绘画
- 观速讯丨中度脂肪肝是什么病严重吗_中度脂肪肝是什么
- 灰饼是什么 灰饼
- 焦点快播:古希腊文读法 希腊文读法
- 全球快资讯丨楚都古钜阳_关于楚都古钜阳简述
- 30天公交地铁免费,济南地铁承载大学生免费客运量近55万人
- 环球快播:演员刘欣图片 演员刘欣个人资料
- 全球热点评!术士职业任务奥法之袍奖励什么 术士职业任务奥法之袍
- 世界短讯!教师节祝福语简短走心 教师节祝福语最新少字
- 环球微速讯:新鲜的大鼠尾鱼哪里掉 新鲜的大鼠尾鱼在哪钓
- 迎春盆景吧
- 环球观热点:秦昭襄王是明君还是昏君_秦昭襄王
- matlab中axis的用法_matlab中axis
- 世界新动态:郴州:春风吹开莽山的文旅市场
- 湖北武汉7位农民获评“副教授”
- 环球消息!佛偈禅语 佛偈
- 气候学家:今明两年全球平均气温或创新高
- 环球微资讯!视频丨我国最新一艘“万吨大驱”,解缆起航!
- 小米手机备份微信聊天记录 小米手机备份
- 全球微资讯!视频丨我国最新一艘“万吨大驱”,解缆起航!
- 文采是什么意思 文笔是什么意思
- 气候学家:今明两年全球平均气温或创新高
- 湖北武汉7位农民获评“副教授”
- 世界热文:谁说话的声音最大 谁说话的声音传得最远脑筋急转弯
- 物理性质和化学性质的区别 物理性质
- 天天观焦点:亮舰!人民海军成立74周年 多型海军主战舰艇向公众开放
- 全球聚焦:矮子坐高凳歇后语怎么说 矮子坐高凳歇后语
- 天天快讯:《低噪音破壁机行业发展白皮书》发布 多维降噪成破壁机市场攻坚重点
- 【收评】尿素日内下跌1.45% 机构称供需预期利好发酵 尿素短期偏强震荡
- 精彩看点:交通信号灯红灯亮时 交通信号灯绿灯亮时
- 萌翻!野生大熊猫花式扭屁股雪地撒欢
- 天天快讯:视频丨“星舰”试飞三分钟解体爆炸,对人类航天有哪些启发?
- 五一假期民航预计运输旅客900万人次
- 世界热门:精读本圣经下载 精读本圣经
- 亮舰!人民海军成立74周年 多型海军主战舰艇向公众开放
- 天天头条:萌翻!野生大熊猫花式扭屁股雪地撒欢
- 当前观点:太阳本场获得46次罚球 快船总裁小卡的膝伤在G1赛后加重但他想挺过去带伤打完了G2(今日/头条)
- 全球消息!金属元素分析仪 金属元素
- 天天速看:五一假期民航预计运输旅客900万人次
- 全球新资讯:泸州“十佳示范小区”“红色物业”名单出炉,有你家小区吗?
- 世界快看点丨视频丨“星舰”试飞三分钟解体爆炸,对人类航天有哪些启发?
- 当前热讯:越级越已为悦人,星途新能源系列星纪元首秀肌肉