Bean的加载方式
目录
1. 基于XML配置文件
2. 基于XML+注解方式声明bean
·自定义bean
·第三方bean
3.注解方式声明配置类
扩展1,FactoryBean
扩展2,加载配置类并加载配置文件(系统迁移)
扩展3,proxyBeanMethods=true的使用
4. 使用@Import注解导入要注入的bean对应的字节码
扩展4,使用@Import注解导入配置类
5. 编程式方式
6. 实现了ImportSelector接口
7.实现ImportBeanDefinitionRegistrar接口
8.实现了BeanDefinitionRegistryPostProcessor接口
总结
便于练习,导一个比较大的包
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version>
</dependency>
1. 基于XML配置文件
<!--声明自定义bean-->
<bean id="bookService"
class="com.itheima.service.impl.BookServiceImpl"
scope="singleton"/>
<!--声明第三方开发bean-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
</beans>

2. 基于XML+注解方式声明bean

·自定义bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.itheima"/>
</beans>
使用注解(如@Component、@Service、@Repository等)来标识Bean类
·第三方bean
在配置类上写@Component才可以被扫描到 (@Configuration也行更推荐)
@Component
public class DbConfig {
@Bean
public DruidDataSource getDataSource(){DruidDataSource ds = new DruidDataSource();return ds;}
}
3.注解方式声明配置类
@Configuration
//@Configuration配置项如果不用于被扫描可以省略
@ComponentScan("com.itheima")
public class SpringConfig {@Beanpublic DruidDataSource getDataSource(){DruidDataSource ds = new DruidDataSource();return ds;}
}
扩展1,FactoryBean
初始化实现FactoryBean接口的类,实现对bean加载到容器之前的批处理操作
public class BookFactoryBean implements FactoryBean<Book> {public Book getObject() throws Exception {Book book = new Book();// 进行book对象相关的初始化工作return book;}public Class<?> getObjectType() {return Book.class;}
}
public class SpringConfig8 {@Beanpublic BookFactoryBean book(){return new BookFactoryBean();}
}
扩展2,加载配置类并加载配置文件(系统迁移)
在新的注解开发的项目中使用原来的老的配置文件,使用@ImportResource,然后指定xml文件
@Configuration
@ComponentScan("com.itheima")
@ImportResource("applicationContext-config.xml")
public class SpringConfig2 {
}
扩展3,proxyBeanMethods=true的使用
使用proxyBeanMethods=true可以保障调用此方法得到的对象是从容器中获取的而不是重新创建的
默认是true
@Configuration(proxyBeanMethods = true)
public class SpringConfig3 {@Beanpublic Book book(){System.out.println("book init ...");return new Book();}
}
先拿到了配置类的对象,从容器中获取,再调用了方法,得到的就是同一个对象
public class AppObject {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);SpringConfig3 config = ctx.getBean("SpringConfig3", SpringConfig3.class);SpringConfig3.book();SpringConfig3.book();}
}
4. 使用@Import注解导入要注入的bean对应的字节码
@Import(Dog.class)
public class SpringConfig5 {
}
被导入的bean无需使用注解声明为bean
public class Dog {
}
此形式可以有效的降低源代码与Spring技术的耦合度,在spring技术底层及诸多框架的整合中大量使用
扩展4,使用@Import注解导入配置类
使用这种方式可以加载配置类,并且也不用加@Configuration了
@Import(DbConfig.class)
public class SpringConfig {}
5. 编程式方式
·使用上下文对象在容器初始化完毕后注入bean
这种只能使用AnnotationConfigApplicationContext,其他不生效
public class AppImport {public static void main(String[] args) {AnnotationConfigApplicationContext ctx =new AnnotationConfigApplicationContext(SpringConfig5.class);ctx.register(Cat.class);String[] names = ctx.getBeanDefinitionNames();for (String name : names) {System.out.println(name);}}
}
6. 实现了ImportSelector接口
导入实现了ImportSelector接口的类,实现对导入源的编程式处理,谁导入他,他就能查谁的户口,把他里面的注解方法等等全部可以获取到
在配置类上@Import(MyImportSelector.class)
public class MyImportSelector implements ImportSelector {public String[] selectImports(AnnotationMetadata metadata) {boolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Import");if(flag){return new String[]{"com.itheima.domain.Dog"};}return new String[]{"com.itheima.domain.Cat"};}
}
7.实现ImportBeanDefinitionRegistrar接口
导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(BookServiceImpl2.class).getBeanDefinition();registry.registerBeanDefinition("bookService", beanDefinition);}}
8.实现了BeanDefinitionRegistryPostProcessor接口
导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的最终裁定
public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(BookServiceImpl4.class).getBeanDefinition();registry.registerBeanDefinition("bookService", beanDefinition);}
}
总之,实现了BeanDefinitionRegistryPostProcessor接口可以对最终的Bean定义产生影响,可以动态地添加、修改或删除Bean定义,从而对应用程序的配置和行为进行定制化。
总结

相关文章:
Bean的加载方式
目录 1. 基于XML配置文件 2. 基于XML注解方式声明bean 自定义bean 第三方bean 3.注解方式声明配置类 扩展1,FactoryBean 扩展2,加载配置类并加载配置文件(系统迁移) 扩展3,proxyBeanMethodstrue的使用 4. 使用Import注解导入要注入的bean…...
《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(13)-Fiddler请求和响应断点调试
1.简介 Fiddler有个强大的功能,可以修改发送到服务器的数据包,但是修改前需要拦截,即设置断点。设置断点后,开始拦截接下来所有网页,直到取消断点。这个功能可以在数据包发送之前,修改请求参数;…...
Android 13(T) - Media框架(1)- 总览
从事Android Media开发工作三年有余,刚从萌新变成菜鸟,一路上跌跌撞撞学习,看了很多零零碎碎的知识,为了加深对Android Media框架的理解,决定在这里记录下学习过程中想到的一些问题以及一些思考,也希望对初…...
简述vue3(ts)+antdesignvue项目框架搭建基本步骤
目录 项目简介 概念 过程简述 基本步骤 1.创建新项目 2.安装Ant Design Vue 3.配置Ant Design Vue 4.创建页面和组件 5.使用组件 6.运行项目 项目简介 概念 Vue 3(使用TypeScript)和Ant Design Vue项目框架搭建是指在Vue 3框架下,…...
webpack : 无法加载文件 C:\Program Files\nodejs\webpack.ps1
webpack : 无法加载文件 C:\Program Files\nodejs\webpack.ps1 1.问题2. 解决办法: 1.问题 使用webpack打包是报错如下: webpack : 无法加载文件 C:\Program Files\nodejs\webpack.ps1,因为在此系统上禁止运行脚本。有关详细信息,…...
GDAL OGR C++ API 学习之路 (5)OGRLayer篇 代码示例
GetStyleTable virtual OGRStyleTable *GetStyleTable () 返回图层样式表 返回: 指向不应由调用方修改或释放的样式表的指针 // 假设图层对象为 poLayer OGRStyleTable* poStyleTable poLayer->GetStyleTable(); if (poStyleTable ! nullptr) {// 处理样式表信息// ..…...
NIDEC COMPONENTS尼得科科宝滑动型DIP开关各系列介绍
今天AMEYA360对尼得科科宝电子滑动型DIP开关各系列参数进行详细介绍,方便大家选择适合自己的型号。 系列一、滑动型DIP开关 CVS 针脚数:1, 2, 3, 4, 8 安装类型:表面贴装,通孔 可水洗:无 端子类型:PC引脚(只…...
一起学算法(滑动窗口篇)
前言: 对于滑动窗口,有长度固定的窗口,也有长度可变的窗口,一般是基于数组进行求解,对于一个数组中两个相邻的窗口,势必会有一大部分重叠,这部分重叠的内容是不需要重复计算的,所以我…...
HTML <q> 标签
实例 标记短的引用: <q>Here is a short quotation here is a short quotation</q>浏览器支持 元素ChromeIEFirefoxSafariOpera<q>YesYesYesYesYes所有浏览器都支持 <q> 标签。 定义和用法 <q> 标签定义短的引用。 浏览器经常在引用的内容…...
机器学习02-再识K邻近算法(自定义数据集训练及测试)
定义: 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。简单的说就是根据你的“邻居”来推断出你的类别。 用个成语就是物以类聚 思想: 如果一个样本在特征空间中的K个最…...
github使用笔记及git协作常用命令
1.Github有一个主库,每个人自己也有一个库,称为分支。 2.Github的协作流程:先从主库fork出自己的分支, 然后进行代码的修改等操作, 操作完之后从本地库上推到自己的服务器分支,然后 服务器分支Pull Request到 主库。 3.本地仓库由git维护的三棵“树"组成:第1个…...
iOS - Apple开发者账户添加新测试设备
获取UUID 首先将设备连接XCode,打开Window -> Devices and Simulators,通过下方位置查看 之后登录(苹果开发者网站)[https://developer.apple.com/account/] ,点击设备 点击加号添加新设备 填写信息之后点击Continue,并一路继续…...
vue 前端 邮箱、密码、手机号码等输入验证规则
最近在写前端表单验证的时候,发现一篇文章质量很好,所以写下这篇文章记录 原文章链接:vue 邮箱、密码、手机号码等输入验证规则 1.手机号 const checkPhone (rule, value, callback) > {const phoneReg /^1[34578]\d{9}$$/;if (!value…...
如何看待前端已死这个问题(大学生篇)
小编刚大学毕业,还记得是大三的时候选择的前端开发方向,那个时候行情其实并没有这么差,最近互联网上讨论这一个很火的话题,叫前端已死。那么我就说说我的看法吧,虽然可能比起行业的大佬会比较短浅,但我想就…...
揭开高级产品经理思维的秘密
我经常被问到产品经理如何晋升到更高级别。事实上,获得晋升往往是一场复杂的游戏。是的,你的技能和成就很重要,但其他因素也很重要,比如你的经理对人才培养的关心程度、你的同事有多优秀、任期有多长、公司的政治氛围如何等等。 所…...
Java 学习路线图
以下是 Java 学习路线图的大致概述: Java 基础语法和面向对象编程(OOP):包括数据类型、控制流、数组、类和对象、继承、多态、抽象类和接口等。 Java 集合框架:包括集合和 Map 等常用数据结构的使用和操作。 Java I/…...
在springboot项目中使用策略工厂模式
在springboot项目中使用策略工厂模式 策略接口类 package cn.test.ext;public interface ITestStrategy {void execTestMethod(); }策略实现类 package cn.test.ext.beanlife;import cn.test.ext.ITestStrategy; import cn.test.ext.MyStrategyFactory; import lombok.exter…...
mysql综合练习语法总结
mysql综合练习 用于 小白练手的主要用于以后语法忘了回来看 题目 # 1、创建数据库test01_library # 2、创建表 books,表结构如下:# 3、向books表中插入记录 # 1)不指定字段名称,插入第一条记录 # 2)指定所有字段名…...
统计神经网络参数量、MAC、FLOPs等信息
0、基础提示 1、FLOPS是用来衡量硬件算力的指标,FLOPs用来衡量模型复杂度。 2、MAC 一般为 FLOPs的2倍 3、并非FLOPs越小在硬件上就一定运行更快,还与模型占用的内存,带宽,等有关 1、FLOPs计算 神经网络参数量。用于衡量模型大…...
【多模态】21、BARON | 通过引入大量 regions 来提升模型开放词汇目标检测能力(CVPR2021)
文章目录 一、背景二、方法2.1 主要过程2.2 Forming Bag of Regions2.3 Representing Bag of Regions2.4 Aligning bag of regions 三、效果 论文:Aligning Bag of Regions for Open-Vocabulary Object Detection 代码:https://github.com/wusize/ovdet…...
大模型小白入门指南:从工作原理到实用技巧(收藏版)
本文深入解析了大语言模型(LLM)的核心工作原理,包括Transformer架构的自注意力机制和位置编码,以及预训练和指令微调的训练范式。同时,文章还提供了实用的提示工程技巧,帮助读者更好地与AI协作。此外&#…...
LightRAG架构解析:从图索引到双层检索的工程实现
1. LightRAG架构概览:为什么需要双层检索? 在传统RAG系统中,我们常常遇到两个核心痛点:信息碎片化和上下文缺失。想象一下,当你问"电动汽车的普及对城市空气质量有何影响"时,传统系统可能分别检索…...
Clawdbot整合Qwen3:32B效果体验:长文档理解与精准问答演示
Clawdbot整合Qwen3:32B效果体验:长文档理解与精准问答演示 1. 从痛点出发:为什么你需要这个工具 如果你经常需要处理技术文档、合同、论文或者产品手册,一定遇到过这样的困扰:面对一份几十页甚至上百页的PDF文件,想要…...
如何从其他理财应用迁移到Ivy Wallet:数据导入完全指南
如何从其他理财应用迁移到Ivy Wallet:数据导入完全指南 【免费下载链接】ivy-wallet Ivy Wallet is an open-source money manager app for android that you can either build or download from Google Play. 项目地址: https://gitcode.com/gh_mirrors/iv/ivy-w…...
AI写专著必备攻略:专业工具推荐,轻松开启学术专著创作之旅
学术专著写作困境与AI工具解决方案 学术专著的严谨性,离不开大量资料和数据的支持。资料的搜集和数据整合,往往是写作过程中最为繁琐和耗时的环节。研究者必须全面检索国内外的前沿文献,以确保这些文献的权威性和相关性,同时还要…...
万象视界灵坛快速部署:GitLab CI流水线自动触发镜像构建与K8s滚动更新
万象视界灵坛快速部署:GitLab CI流水线自动触发镜像构建与K8s滚动更新 1. 项目概述 万象视界灵坛(Omni-Vision Sanctuary)是一款基于OpenAI CLIP技术的高级多模态智能感知平台。该平台通过创新的像素风格界面,将复杂的语义对齐过…...
Phi-4-reasoning-vision-15B部署教程:开源大模型镜像适配国产GPU方案
Phi-4-reasoning-vision-15B部署教程:开源大模型镜像适配国产GPU方案 1. 模型介绍 Phi-4-reasoning-vision-15B是微软推出的视觉多模态推理模型,具备强大的图像理解和分析能力。这个15B参数规模的模型特别擅长处理需要结合视觉和语言理解的复杂任务。 …...
Leather Dress Collection 角色扮演效果:模拟不同风格的IT技术面试官
Leather Dress Collection 角色扮演效果:模拟不同风格的IT技术面试官 最近在玩一个挺有意思的AI工具,叫Leather Dress Collection。名字听起来有点怪,但它有个功能让我眼前一亮:角色扮演。你可以让它扮演各种角色,并且…...
老旧设备重生:开源工具OpenCore Legacy Patcher让旧Mac焕发新生的终极解决方案
老旧设备重生:开源工具OpenCore Legacy Patcher让旧Mac焕发新生的终极解决方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 您是否拥有一台被苹…...
原创:第三篇(工程落地・首个抓手)电磁筑基:无线充电工程落地总案
第三篇(工程落地・首个抓手)电磁筑基:无线充电工程落地总案 作者:华夏之光永存 总摘要 当前人类电磁学应用仍处于婴孩阶段,现有电磁能量传输技术多局限于有线模式,存在传输损耗高、场景适配性差、灵活性不足…...
