SpringBoot原理篇-Bean的8种加载方式

京东一面:Spring Boot 如何热加载jar实现动态插件? 一、背景 动态插件化编程是一件很酷的事情,能实现业务功能的 解耦 便于维护,另外也可以提升 可扩展性 随时可以在不停服务器的情况下扩展功能,也具有非常好的 开放性 除了自己的研发人员可以开发功能之外,也能接纳第三方开发商按照规范开发的插件。 常见的动态插件的实现方式有 SPI、OSGI 等方案,由于脱离了 Spring IOC 的管理在插件中无法注入主程序的 Bean 对象,例如主程序中已经集成了 Redis 但是在插件中无法使用。 本文主要介绍在 Spring Boot 工程中热加载 jar 包并注册成为 阅读详情

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.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">
  <context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>
  <!--声明自定义bean-->
  <bean id="testService" class="com.Learning1.service.impl.Service" scope="singleton"/>
  <!--声明第三方开发bean-->
  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
</beans>

2.XML+注解方式声明bean

  • 此种方式需要在xml配置文件中声明命名空间
    开启命名空间后,指定包扫描位置
<?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/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">
  <context:component-scan base-package="com.Learning2"/>
</beans>

然后使用@Component注解以及其衍生注解@Controller,@Service,@Repository定义bean

@Service
public class AccountServiceImpl implements AccountService {
}

如果要定义第三方bean,需要使用@Bean注解定义在方法上面,并将所在类定义为配置类或Bean

@Configuration
//@Component
public class DbConfig {
  
  @Bean
  public DruidDataSource getDataSource(){
    DruidDataSource dataSource = new DruidDataSource();
    return dataSource;
  }

}

@Configuration注解包含了@Component注解

3.纯注解加载Bean

将xml配置文件改为一个配置类,用配置类取代xml配置的功能

@Configuration
@ComponentScan("com.Learning2")
public class SpringConfig {
}

关于FactoryBean接口的类

实现FactoryBean接口的类也是用来创建bean的,它存在的意义就在于能够在bean创建之前进行一系列的前置工作,比如判断创建条件,设置bean的信息等
对实现了FactoryBean接口的类加上@Bean注解,创建出来的bean不是那个类而是工厂造出来的对象的bean

public class TestDaoFactoryBean implements FactoryBean<TestDao> {

  @Override
  public TestDao getObject() throws Exception {
    return new TestDaoImpl();
  }

  @Override
  public Class<?> getObjectType() {
    return TestDao.class;
  }

  @Override
  public boolean isSingleton() {
    return true;
  }
}

关于@Configuration注解中的proxyBeanMethods属性

proxyBeanMethods=true可以保证调用有@Configuration注解的类的方法得到的对象是从spring容器中获取的而不是重新创建的。proxyBeanMethods的默认值是true

4.使用@Import注解导入

将需要其对象注册为Bean的类作为参数填入@Import注解中即可
这种形式可以有效的降低源代码与spring技术的耦合度

@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}

5.使用上下文对象在容器初始化完毕后注入bean

public class App {

  public static void main(String[] args) {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    applicationContext.register(UserService.class);
    applicationContext.registerBean("testDao",TestDao.class);
  }
}

6.通过ImportSelector接口加载bean

在配置类中导入实现了ImportSelector接口的类,实现对导入源的编程式处理
谁引用了这个类,这个类就可以获取这个类的一系列信息

@Import({MyImportSelector.class})
@EnableTransactionManagement
public class SpringConfig {
}
public class MyImportSelector implements ImportSelector {

  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    importingClassMetadata.hasAnnotation("org.springframework.context.annotation.Configuration");
    return new String[]{"com.Learning2.Dog"};
  }
}

7.通过ImportBeanDefinitionRegistrar接口创建bean

这种方法深入到bean的定义过程,使用方法和上一种类似
导入实现了ImportBeanDefinitionRegistrar接口的类,通过beanDefinition的注册器注册实名bean,实现对容器中bean的裁定

@Import({MyImportBeanDefinitionRegistrar.class})
public class SpringConfig {
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

  @Override
  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
      BeanDefinitionRegistry registry) {
    BeanDefinition beanDefinition = BeanDefinitionBuilder
                                    .rootBeanDefinition(Dog.class)
                                    .getBeanDefinition();
    registry.registerBeanDefinition("dodo",beanDefinition);
  }
}

8.BeanDefinitionRegistryPostProcessor决定bean的创建

这个接口是bean创建的最终决定接口,实现了这个接口的类可以处理之前过程中已经创建的bean,也可以新增bean,是一个最终裁定的接口
使用方式和上一个接口的方式类似
导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的最终裁定

@Import({MyPostProcessor.class})
public class SpringConfig {
}
public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {

  @Override
  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry)
      throws BeansException {
    BeanDefinition beanDefinition = BeanDefinitionBuilder
        .rootBeanDefinition(Dog.class)
        .getBeanDefinition();
    beanDefinitionRegistry.registerBeanDefinition("dodo",beanDefinition);
  }

  @Override
  public void postProcessBeanFactory(
      ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

  }
}

除了上面8种方式spring还有一些其他的加载bean的方式,这里就不再叙述了。

MyBatis整合Springboot多数据源实现 数据源,实际就是数据库连接池,负责管理数据库连接,在Springboot中,数据源通常以一个bean的形式存在于IOC容器中,也就是我们可以通过依赖注入的方式拿到数据源,然后再从数据源中获取数据库连接。那么什么是多数据源呢,其实就是IOC容器中有多个数据源的bean,这些数据源可以是不同的数据源类型,也可以连接不同的数据库。本文将对多数据如何加载,如何结合MyBatis使用进行说明,知识点脑图如下所示。数据源,其实就是数据库连接池,负责数据库连接的管理和借出。目前使用较多也是性能较优的有如下几款数据源。 阅读详情

相关推荐

5分钟搞定Nano-Banana图片编辑API对接:从Base64编码到生成图片全流程

本文详细介绍了如何快速对接Nano-Banana图片编辑API,基于gemini-2.5-flash-image-preview模型,从环境准备、Base64编码到API调用的全流程。通过实战示例和优化技巧,帮助开发者高效集成AI图片处理能力,提升产品竞争力。

dog123的博客 260

springboot初始化bean对象

springboot使用xml方式初始化bean对象 个人是在使用springboot构建swagger的时候遇到了这个问题,因为需要通过配置文件的方式类来应对各种环境: 1.创建bean.xml配置文件,将需要初始化的bean对象配置到xml文件中 2.创建类Config并注入配置文件 package com.demo.dbank.util; import org.springframewo...

qq_38703193的博客 2066

数据采集卡架构与PCIe优化设计详解

数据采集卡(DAQ)作为工业自动化中的关键设备,其核心在于模数转换(ADC)和数字信号处理技术。现代系统普遍采用PCIe总线架构,通过DMA传输和时钟同步技术实现高速数据采集。在信号调理环节,可编程增益放大器(PGA)和抗混叠滤波器确保信号质量;而Σ-Δ型ADC则提供高达24位的分辨率。实际应用中,从电力监测到机床振动分析,数据采集卡需要结合具体场景优化配置。通过合理的PCB布局和EMI防护设计,可以有效提升系统在工业环境中的可靠性。

weixin_29168675的博客 912

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

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

m0_45877477的博客 3051

提示deepseek生成完整的json用于对接外部API

通过精准的提示词设计(字段过滤、格式约束)、动态验证机制(自检与修正)和官方模板参考,可有效确保DeepSeek生成的JSON纯净无冗余。

神棍之路 2309

基于深度视觉实现机械臂对目标的识别与定位

Marker ID 和 Marker size 自选,在 launch 文件中做相应的修改(本教程演示使用 Marker ID:582,Marker size:30mm)根据相机和机械臂的安装方式不同,手眼标定分为眼在手上和眼在手外两种方式,双臂机器人的相机和机械臂基座的相对位置固定,所以应该采用眼在手外的手眼标定方式。后续的视觉引导机械臂抓取测试实验基于本实验实现,通过视觉引导右臂完成抓取目标物,所以默认已使用机械臂右臂和相机完成了手眼标定。文件,根据打印的marker 标签,需要配置。

realman_Rop的博客 3768

SpringBoot动态加载jar包中的bean

springboot动态加载jar中的bean,在有些业务场景下,需要SpringBoot来动态加载jar中的class文件,自动往spring容器中添加新的bean;如物联网设备上传的信息用物模型来解析,用java来解析物模型,但用户的设备千差万别,解析设备的物模型不可能包罗万象,设备往物联网平台上传的数据格式也是千差万别,这时就可以让用户自已实现解析物模型的java代码,然后打成jar包,上传到物联网平台,物联网平台就可以解析当前用的设备信息了。

专注技术交流、咨询 5070

基于车辆运动学的规划算法 - Hybrid A*/ State Lattice Planning (前置知识:自行车模型、Dubins、Reeds Shepp、多项式曲线、螺旋曲线)

本文将按顺序讲解基于车辆运动学的规划算法,以及需要的前置知识:自行车模型、Dubins和Reeds Shepp曲线、多项式曲线和螺旋曲线

BigDavid123的博客 4860

SpringBoot SpringBoot 原理篇 1 自动配置 1.8 bean 的加载方式【六】

SpringBoot SpringBoot 原理篇 1 自动配置 1.8 bean 的加载方式【六】

代码改变世界 474

在ArcGIS Pro软件中进行滑坡的敏感性和易发性分析

滑坡的敏感性和易发性分析需要综合地形、水文、地质及环境等多维数据,本文罗列了基于ArcGIS Pro软件进行的一系列可执行分析。

weixin_49609713的博客 1734

YOLOv13改进策略【Neck篇】| GSConv 轻量卷积,Slim-Neck 减参数还不掉点

Neck 篇的第二篇继续"替换式"改进,这次的对象是 Neck 里的下采样卷积。GSConv 出自《Slim-neck by GSConv: a better design of lightweight detector》(2022),它的出发点:DWSConv(深度可分离)轻但"信息混不进通道",标准卷积重但表达好——GSConv 用GConv(分组卷积)混通道 + DWConv 补空间 + Channel Shuffle 打散,两全其美。

qq_53329130的博客 30

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

深入浅出块I/O子系统(四)请求处理过程

BIO请求处理的流程 函数scsi_request_fn()代码(摘自文件drivers/scsi/scsi_lib.c) (1)static void scsi_request_fn(struct request_queue *q) (2)int scsi_dispatch_cmd(struct scsi_cmnd *cmd) { host->hostt->queuecommand(host, cmd) } (3)struct sas_internal *i sas_queuec

sinat_37817094的博客 1348

【springboot原理篇】Bean的加载方式,面试必看

配置自己的或者第三方的bean:id:指定bean的名称 class指定bean的位置--声明自定义bean-->--声明第三方bean-->并不是你返回值是什么就创建什么bean,例如factorybean就是创建的它的泛型的bean。

Panci_的博客 1122

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Springboot之Bean的加载过程

加载和实例化bean分以下几个重要步骤: 1、根据package扫描出需要被管理的类 2、将这些类封装成BeanDefinition并注册到BeanFactory容器 3、实例化所有扫描到的BeanDefinition,其中包括解决循环依赖、延迟加载问题 下面这张图根据Springboot启动调用链的顺序,画了这三个关键步骤被触发的时间点: 1、springboot怎么根据package扫描出需要被管理的类? springboot是通过启动类上的@ComponentScan注解所指定的包路径来进行扫描的,

肆頭的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SpringBoot自动配置中bean的加载方式

1. bean的定义由前期xml配置逐步演化成注解配置,本质是一样的,都是通过反射机制加载类名后创建对象,对象就是spring管控的bean 2. @Import注解可以指定加载某一个类作为spring管控的bean,如果被加载的类中还具有@Bean相关的定义,会被一同加载 3. spring开放出了若干种可编程控制的bean的初始化方式,通过分支语句由固定的加载bean转成了可以选择bean是否加载或者选择加载哪一种bean

我是程序员Amin,关注我,带你学习有趣的计算机知识 1774

SpringBoot原理篇-bean的加载方式

由于方式一种需要将spring管控的bean全部写在xml文件中,对于程序员来说非常不友好,所以就有了第二种方式。哪一个类要受到spring管控加载成bean,就在这个类的上面加一个注解,还可以顺带起一个bean的名字(id)。这里可以使用的注解有@Component以及三个衍生注解@Service、@Controller、@Repository。@Service当然,由于我们无法在第三方提供的技术源代码中去添加上述4个注解,因此当你需要加载第三方开发的bean的时候可以使用下列方式定义注解式的bean。

· 1097

如何正确控制springboot中bean的加载顺序总结

1.为什么需要控制加载顺序springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件...

qianshanding0708的博客 2万+

【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 2619

SpringBoot原理前置知识-bean的8种加载方式

一、复习spring的前置知识 Bean初始化 1.xml方式(先创一个spring工程项目导入依赖) <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</

ssdssa的博客 1031

Springboot | bean的加载方式

Bean的加载方式学习笔记

云创网络工作室官方账号 1566

Spring中Bean的加载与SpringBoot的初始化流程

前言:一直对它们之间的关系感到好奇,SpringBoot既然是Spring的封装,那么SpringBoot在初始化时应该也会有Bean的加载,那么是在何时进行加载的呢? 参考: https://blog.youkuaiyun.com/qq_36688143/article/details/84968036 https://blog.youkuaiyun.com/q610376681/article/details/87928766 https://blog.youkuaiyun.com/q610376681/article/detai

仰望星空 5704

SpringBoot SpringBoot 原理篇 1 自动配置 1.10 bean 的加载方式【八】

SpringBoot SpringBoot 原理篇 1 自动配置 1.10 bean 的加载方式【八】

代码改变世界 332

SpringBoot中Bean的懒加载

在SpringBoot中,Bean的懒加载是指Spring容器在第一次实际使用Bean时才创建该Bean实例,而不是在容器启动时立即创建。这种机制可以减少启动时间,尤其是当有些Bean创建成本较高或者不经常使用时。

赵KK的博客 1906

springboot原理:自动配置工作流程,8种bean的加载方式

关于bean的加载方式,spring提供了各种各样的形式。因为spring管理bean整体上来说就是由spring维护对象的生命周期,所以bean的加载可以从大的方面划分成2种形式。已知类并交给spring管理,和已知类名并交给spring管理。有什么区别?一个给.class,一个给类名字符串。内部其实都一样,都是通过spring的BeanDefinition对象初始化spring的bean。如果前面这句话看起来有障碍,可以去复习一下spring的相关知识。

weixin_64537269的博客 1031

SpringBoot SpringBoot 原理篇 1 自动配置 1.6 bean 的加载方式【四】

SpringBoot SpringBoot 原理篇 1 自动配置 1.6 bean 的加载方式【四】

代码改变世界 454
上一篇: Spring-AOP
下一篇: SpringBoot-自定义starter
南懿烨曦
博客等级 码龄6年 108粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值