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使用进行说明,知识点脑图如下所示。数据源,其实就是数据库连接池,负责数据库连接的管理和借出。目前使用较多也是性能较优的有如下几款数据源。 阅读详情

相关推荐

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4869

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

cmu15445(2024fall) project 2

project 2比p1难度要更大,代码量更大且涉及的知识更多,实现中出现的bug更多,好在是最后全部解决了。我最大的收获在于对于多线程编程的理解更深入了,实际发现解决了多个多线程相关的bug,学会了更多多线程下debug的技巧方法,也见识了更多多线程的bug情况。在之后可以更系统的学习一下多线程编程。同时学会实现B+树也是需要掌握的基础。

Jerome_Yi的博客 1561

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

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

m0_45877477的博客 3051

银河麒麟v10装Docker实战:在线离线安装与容器部署指南

容器技术作为现代软件交付的核心方式,通过将应用与依赖打包成镜像,实现了环境的一致性与快速部署。Docker作为最流行的容器引擎,其安装与配置是上云和国产化转型中的基础技能。在国产操作系统银河麒麟v10环境中,由于系统兼容性和网络环境的差异,Docker的部署需要特别注意在线与离线两种模式的选择。本文从基础概念出发,结合麒麟v10的实际环境,详细梳理了Docker引擎的安装、镜像加速、存储配置以及MySQL、Redis等常用容器的部署方法,并针对SELinux、cgroup驱动等常见问题给出了解决方案,帮助开

weixin_30431445的博客 148

详细介绍:国产操作系统银行麒麟V10的下载和安装

银河麒麟是由。银河麒麟已经发展为银河麒麟服务器操作系统、桌面操作系统、嵌入式操作系统、麒麟云、操作系统增值产品为代表的产品线。为攻克中国软件核心技术“卡脖子”的短板,银河麒麟建设自主的开源供应链,发起中国首个开源桌面操作系统根社区openKylin,银河麒麟操作系统以openKylin等自主根社区为依托,发布最新版本。

lz17267861157的博客 1万+

SpringBoot动态加载jar包中的bean

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

专注技术交流、咨询 5070

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

银行信息系统应用架构详解 885

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

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

代码改变世界 474

智能驾驶域控制器的“终极大考”:解析EOL测试的核心价值与技术实践

在智能驾驶技术高速发展的今天,域控制器(Domain Controller)作为车辆“大脑”的核心部件,承担着传感器数据处理、决策规划、执行控制等关键任务。然而,这个集成了数十个芯片、运行着数百万行代码的复杂系统,如何确保其出厂前的功能安全与性能稳定?答案就藏在被称为“生产线最后一道防线”的EOL(End of Line)测试中。

汽车电子软件领域知识分享 704

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

Panci_的博客 1122

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Springboot之Bean的加载过程

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

肆頭的博客 1万+

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

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

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、付费专栏及课程。

余额充值