不看后悔,最全介绍Spring Bean的8种加载方式

Spring Bean的8种加载方式,90%的程序员都说不全 以前学习Spring框架的时候,总结了几种Bean的加载方式,不过老师说还有其它的加载方式,以下八种并不是全部,但也足以用来做很多事情了。注意以下是Spring中Bean的加载方式,不是SpringBoot,但其中的很多东西是相通的,尤其是Bean的注入方式、适用场景等,在本文中也有介绍的。分享给大家一起学习,如有错误的地方,麻烦各位在评论区帮我指出🤣🤣。 阅读详情

 

前言

以前学习Spring框架的时候,总结了几种Bean的加载方式,不过应该还有其它的加载方式,以下八种并不是全部,但也足以用来做很多事情了。

注意以下是Spring中Bean的加载方式,不是SpringBoot,但其中的很多东西是相通的,尤其是Bean的注入方式、适用场景等,在本文中也有介绍的。

1.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- xml方式声明自己开发的bean --> <bean id="user" class="cn.sticki.blog.pojo.domain.User" /> <!-- xml方式声明第三方bean --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/> </beans>

2.xml:context+注解(@Component+4个@Bean)

  • 使用组件扫描,指定加载bean的位置,spring会自动扫描这个包下的文件。

  • <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!-- 组件扫描,指定加载bean的位置 --> <context:component-scan base-package="cn.sticki.bean,cn.sticki.config"/> </beans>

  • 然后在需要被加载的类名上添加@Component注解。也可以使用@Controller、@Service、@Repository定义bean。

  • @Service publice class UserServiceImpl implements UserService { }

  • 使用@Bean定义第三方bean,并将所在类定位为配置类或Bean

  • @Configuration // 或使用@Component public class DBConfig { @Bean public DruidDataSource dataSource(){ DruidDataSource ds = new DruidDataSource(); return ds; } }

3.配置类+扫描+注解(@Component+4个@Bean)

使用 AnnotationConfigApplicationContext(SpringConfig.class); 来获取 ApplicationContext

public class AppObject { public static void main() { ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); SpringConfig config = ctx.getBean("Config", SpringConfig.class); // 两次获取的是同一个对象 config.user(); config.user(); } }

和上面的第二种有点类似,就是包的扫描方式有所改变。

@ComponentScan({"cn.sticki.bean","cn.sticki.config"}) public class SpringConfig { @Bean public DogFactoryBean dog(){ return new DogFactoryBean(); } }

3.1FactoryBean接口

初始化实现FactoryBean接口的类,实现对bean加载到容器之前的批处理操作。

public class DogFactoryBean implements FactoryBean<Dog> { @Override public Dog getObject() throws Exception { return new Dog(); } @Override public Class<?> getObjectType() { return Dog.class; } }

在下面的bean中,显示的表示为配置DogFactoryBean ,但实际上配置的是 Dog 。

@Component public class SpringConfig { @Bean public DogFactoryBean dog(){ return new DogFactoryBean(); } }

3.2@ImportResource注解

用于加载配置类并加载配置文件(系统迁移)

@Configuration @ComponentScan("cn.sticki.bean") @ImportResource("applicationContext.xml") public class SpringConfig { }

3.3proxyBeanMethods属性

使用 proxyBeanMethods = true 可以保障调用此类中的方法得到的对象是从容器中获取的,而不是重新创建的,但要求必须是通过此类调用方法获得的bean。

@Configuration(proxyBeanMethods = true) public class SpringConfig { @Bean public User user() { System.out.println("user init..."); return new User(); } }

4.@Import导入bean的类

使用@Import注解导入要注入的bean对应的字节码

@Import(User.class) public class SpringConfig { }

而被导入的bean无需使用注解声明为bean

public class User{ }

这种形式可以有效的降低源代码与spring技术的耦合度(无侵入),在spring技术底层及诸多框架的整合中大量使用。

使用这种方法可以加在配置类,且也可以加在配置类当中的bean。

5.AnnotationConfigApplicationContext调用register方法

在容器初始化完毕后使用容器对象手动注入bean

public class App { public static void main() { ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); ctx.register(User.class); // 打印容器中当前的所有bean String[] names = ctx.getBeanDefinitionNames(); for (String name: names) { System.out.println(name); } } }

必须在容器初始化之后才能使用这种方法。如果重复加载同一个bean,后面加载的会覆盖前面加载的。

6.@Import导入ImportSelector接口

导入实现了ImportSelector接口的类,实现对导入源的编程式处理

public class MyImportSelector implements ImportSelector { public String selectImports(AnnotationMetadata metadata) { // 使用metadata可以获取到导入该类的元类的大量属性,通过对这些属性进行判断,可以达到动态注入bean的效果 boolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Import"); if(flag) { return new String[]{"cn.sticki.pojo.User"}; } return new String[]{"cn.sticki.pojo.Dog"}; } }

调用处:

@Import(MyImportSelector.class) public class SpringConfig { }

7.@Import导入ImportBeanDefinitionRegistrar接口

导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的绑定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果。

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { public String registrarBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { // 使用元数据去做判定,然后再决定要注入哪些bean BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition(); registry.registerBeanDefinition("user",beanDefinition); } }

调用处和上面第六种方式差不多。

8.@Import导入BeanDefinitionRegistryPostProcessor接口

导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的最终裁定。其在@Import中的加载顺序为最后一个加载,可以用来做bean覆盖的最终裁定。

public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // 注意这里注册的是BookServiceImpl4 BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(BookServiceImpl4.class).getBeanDefinition(); registry.registerBeanDefinition("bookService",beanDefinition); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } }

调用处:

// 按照先后顺序加载,但 MyPostProcessor.class 最后才加载 @Import(BookServiceImpl1.class,MyPostProcessor.class, BookServiceImpl.class, MyImportSelector.class) public class SpringConfig { }

后记

这八种加载方式几乎可以满足我们所需要的全部场景了,但一般场景下,我们用的其实也就只有那两三种,真正掌握这八种加载方式的朋友,肯定是大佬了(°Д°)

Spring bean 动态注册,jar包热替换 Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对相应的bean进行动态注册,以及jar与class文件动态加载。测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录中的jar实现类。 立即下载

相关推荐

LTspice基础教程-024.参数扫描;step指令用法

step指令用于参数扫描,扫描步骤可以是线性的,对数的或列表。 下面介绍几种常用用法: 绘制一简单电阻分压电路,如下: 线性扫描 语法:.step param <Name> <Start Value> <Stop Value> <Increment> 例:.step param Res 20 100 20 意思是R2的阻值从20变化到100,...

gaoyong_wang的博客 3万+

SpringBoot八种bean的加载方式

2.xml:context+注解(@Component+4个@Bean3.配置类+扫描+注解(@Component+4个@Bean)@Bean定义FactoryBean接口@Configuration注解的proxyBeanMethods属性4.@Import导入bean的类@Import导入配置类5.AnnotationConfigApplicationContext调用register方法6.@Import导入ImportSelector接口。

weixin_60719453的博客 8156

K型热电偶负电压采集难题?3种运放电路设计方案对比(含Multisim仿真)

本文针对K型热电偶在低温测量中产生的负电压采集难题,详细对比了三种运放电路设计方案,包括双电源运放反相放大、单电源仪表放大器和差分放大电路,并结合Multisim仿真数据分析了各方案的性能差异。文章还提供了PCB布局和抗干扰设计的实战技巧,帮助工程师解决热电偶信号采集中的核心挑战。

postgres8guard的博客 1019

【Spring】八种常见Bean加载方式

本篇介绍了Spring中八种常见Bean的加载方式以及相关知识的补充

观止study 2978

CDO批量处理nc文件:5分钟搞定CMIP6数据双线性插值(附完整代码)

本文详细介绍了如何使用CDO工具链中的`remapbil`命令,快速实现CMIP6数据的批量双线性插值处理。通过环境配置、核心操作步骤、高级优化技巧及典型报错解决方案,帮助科研人员高效处理大规模nc文件,显著提升气象数据处理效率。

weixin_29267307的博客 294

UE5 C++教程(一、基本结构)

虚幻API由三块组成,分别是Runtime,Developer utilitiew,functionality for the Editor,大多数游戏性编程只使用运行时模块,最常见的三个是Corn、CornUObject和Engine。

skycol的博客 1万+

Spring 最全Bean的加载和获取方式整理

Spring Framework是一个强大且广泛使用的Java应用程序框架,它提供了众多功能和工具,其中之一就是Spring容器。Spring容器是Spring应用程序的核心,它负责管理和维护对象(通常称为"Bean")的生命周期。在Spring中,Bean的加载和获取是常见的操作,本文将总结Spring Bean的加载和获取方式,以帮助开发者更好地理解和使用Spring框架。

lucky_fd的博客 2351

利用GBD数据库做未来疾病负担预测

最近看到一篇文献,利用GBD数据库中的数据对疾病负担的发展趋势进行预测。觉得很有趣,就抽空用R语言复盘了一下里面关键的方法。 参考文献: Changing trends in the disease burden of esophageal cancer in China from 1990 to 2017 and its predicted level in 25 years DOI: 10.1002/cam4.3775 1. 相关R包的安装 主要用到的R包有3个,一个一个讲: 1.1 Nordpred

NickyCat的博客 5万+

Spring Bean的加载方式【8种】

本文讲述了Spring bean 的八种加载方式,包含的内容足以应付大多数场景

阿杆的博客 4205

零基础搭建机械零件检测系统:基于YOLOv8的PySide6可视化开发全攻略

本文详细介绍了如何从零开始搭建基于YOLOv8的机械零件检测系统,涵盖环境配置、数据集准备、模型训练优化及PySide6可视化界面开发全流程。通过实战案例展示YOLOv8在工业检测中的高效应用,帮助开发者快速实现自动化零件检测解决方案。

weixin_28455801的博客 309

沉降预测算法-指数曲线法

沉降预测的指数曲线法原理和代码实现

yh523的博客 1010

【Spring】Bean的八种加载方式

一、XML方式声明bean 配置文件 1.在xml中声明自定义的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" xsi:schemaLocation="http://www.springfra

Hello World! 2426

Android 9.0 系统framework关于忘记开机锁屏密码进不去系统桌面清除锁屏密码问题的解决

在9.0的系统rom定制化开发中,在一些产品中带锁屏密码的功能中,系统默认是滑动解锁,但是客户会设置锁屏密码,在某些时候会 忘掉锁屏密码,导致需要进入恢复出厂设置然后才能进入系统桌面,这样就导致系统的保存的资料都丢失了,所以需要要求提供接口 在下拉状态栏中或者系统服务中在忘记锁屏密码后不恢复出厂设置的情况下,可以清除锁屏密码,接下来就来实现功能

安卓兼职framework和app工程师的博客 618

【Spring】Bean加载方式

registerBeanDefinitions方法的第一个参数和我们在上一种加载方式中使用过的annotationMetadata的作用是一样的,因此在这里我就不再过多介绍了,我们重点看第二个参数。第二个参数的类型是BeanDefinitionRegistry,光看名字我们知道了这是一个关于BeanDefinition的注册表,那么什么是BeanDefinition呢?这个其实涉及到spring比较底层的东西了,BeanDefinition实际上记录的是关于一个Bean的一系列信息,它包括但不限于:

qq_50675319的博客 2286

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Bean的加载方式

Spring Bean的加载方式

qq_33753147的博客 1607

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring Boot中选择性加载Bean的几种方式

Spring Boot中选择性加载Bean的几种方式

小何的博客 2329

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring bean加载的三种方式

Spring bean加载的三种方式 UserService: package com.njtech.service; public interface UserService { public void add(); } UserServiceImpl: package com.njtech.service.Impl; import com.njtech.service.Use...

不怕万人阻挡,只怕自己投降 5687

spring学习(spring容器、加载配置文件方式、获取bean的方式)

本篇博客的学习的主要内容:springIoC容器(BeanFactory、ApplicationContext)的初始化方式与核心区别、加载spring配置文件的几种方式、获取bean的几种常用方式...

岁岁岁平安的博客 1313

Spring加载bean的多种方式

在 Spring 框架中,加载 Bean 的方式非常灵活,支持多种配置和扩展机制。以下是你列出的 8 种加载 Bean 的方式的详细说明,包括原理、使用场景和示例代码。这是 Spring 最早的 Bean 加载方式,通过 XML 配置文件定义 Bean。特点• 使用 标签在 XML 文件中定义 Bean。 • 通过 或 加载 XML 文件。示例 使用场景• 适用于需要与遗留系统集成的场景。 • 适合简单的配置,但不推荐在现代项目中使用。通过 扫描注解,结合 XML 中的 定义。特点• 使用 标

qq_33529823的博客 1175

SpringBoot原理篇:bean的3种加载方法使用、8种bean的加载方式一览

1 使用xml方式定义bean 2 xml+注解方式定义bean 3 使用全注解方式定义bean

m0_45877477的博客 3051

Spring原理-加载bean的8种方式

案例:在已有的项目(该项目使用xml文件配置bean)中,自己如何变成注解开发。

weixin_46926189的博客 654

spring加载bean的过程

首先,我在这里举个demo,大致演示一下怎么获取配置文件中的bean: 一个applicationContext.xml配置文件,这个不可少; 一个bean,这里我没用接口,直接用一个普通的类做为Spring的bean; 一个Junit测试类; applicationContext.xml中的代码如下: MyBean类中的代码如下: public c

坤健的博客 1万+

Spring底层原理之bean的加载方式八 BeanDefinitionRegistryPostProcessor注解

在Spring框架中,Bean的底层数据结构通常是使用HashMap或ConcurrentHashMap来存储的。具体来说,Spring使用一个名为BeanFactory的接口来管理Bean,其默认实现是DefaultListableBeanFactory,它内部使用一个ConcurrentHashMap来存储所有的Bean实例,以及它们的相关信息。 这种设计使得Spring能够高效地管理大量的Bean,并且支持并发访问。通过HashMap或ConcurrentHashMap,Spring能够根据Bean

多多的博客 11万+

Spring加载Bean的多种方式

这种方式在早起的项目中很常见,但是由于容易导致配置文件的爆炸式增长,致使其难以维护,现在的使用已经越来越少。</在Java代码中可以获取名为person的bean。这样我们可以轻松获取到bean。

圆师傅的博客 578

【SpringBoot学习13】Bean的加载方式,加载控制以及配置管理

文章目录1. Bean的加载方式1.1 xml方式声明Bean1.2 xml+注解方式声明Bean1.3 注解方式声明Bean1.4 使用@Import注解注入bean1.5 编程形式注册bean1.6 导入实现了ImportSelector接口的类2. Bean的加载控制3 Bean的依赖属性配置管理 1. Bean的加载方式 1.1 xml方式声明Bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.s

一个正在努力学习的iter 2620

由浅入深,详细总结 Spring 八种加载 Bean 的方式

方式一:XML 方式声明 bean 方式二:XML + 注解方式声明 bean 方式三:注解方式声明配置类 方式四:@Import 注解注入 方式五:上下文对象在容器初始化完毕后注入 方式六:实现 ImportSelector 接口 方式七:实现 ImportBeanDefinitionRegistrar 接口 方式八:实现 BeanDefinitionRegistryPostProcessor 接口

秀岩的博客 1749
上一篇: 让这篇4000字长文告诉你什么是TCP 序列号和确认号
下一篇: 还在用main方法测试吗,带你来认识什么才是专业的SpringBoot项目测试方法
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值