Spring 核心概念

python代码爬取大众点评评论!直接copy就可以运行! 阅读详情

Spring 核心概念

引言

本文主要介绍 Spring 源码中使用到的一些核心类

1. BeanDefinition

BeanDefinition表示Bean定义,BeanDefinition 中存在很多属性用来描述一个Bean的特点。比如:

  • class,表示Bean类型
  • scope,表示Bean作用域,单例或原型等
  • lazylnit:表示Bean是否是懒加载
  • initMethodName:表示Bean初始化时要执行的方法
  • destroyMethodName:表示Bean销毁时要执行的方法
  • 还有很多。。。

在Spring中,我们经常会通过以下几种方式来定义Bean:

  1. bean 标签
  2. @Bean
  3. @Component(@Service,@Controller)

 

这些,我们可以称之申明式定义Bean。

我们还可以编程式定义Bean,那就是直接通过BeanDefinition,比如:

2. BeanDefinitionReader

接下来,我们来介绍几种在Spring源码中所提供的BeanDefinition读取器(BeanDefinitionReader),这些BeanDefinitionReader在我们使用Spring时用得少,但在Spring源码中用得多,相当于Spring源码的基础设施。

AnnotatedBeanDefinitionReader

BeanDefinition 读取器,可以直接把某个类转换为BeanDefinition,并且会解析该类上的注解,比如:

注意:它能解析的注解是:@Conditional,@Scope、@Lazy、@Primary、@DependsOn、@Role、@Description

XmlBeanDefinitionReader

可以解析 标签,将 xml 文件中定义的 bean 解析为 BeanDefinition

ClassPathBeanDefinitionScanner

ClassPathBeanDefinitionScanner是扫描器,但是它的作用和BeanDefinitionReader类似,它可以进行扫描,扫描某个包路径,对扫描到的类进行解析,比如,扫描到的类上如果存在@Component注解,那么就会把这个类解析为一个BeanDefinition,比如:

3. BeanFactory

BeanFactory表示Bean工厂,所以很明显,BeanFactory会负责创建Bean,并且提供获取Bean的APl。\

而 ApplicationContext 是 BeanFactory 的一种,在 Spring 中的定义如下

首先,在Java中,接口是可以多继承的,我们发现ApplicationContext继承了ListableBeanFactory和HierarchicalBeanFactory,而ListableBeanFactory和HierarchicalBeanFactory都继承至BeanFactory,所以我们可以认为ApplicationContext继承了BeanFactory,相当于苹果继承水果,宝马继承汽车一样,ApplicationContext也是BeanFactory的一种,拥有BeanFactory支持的所有功能,不过ApplicationContext比BeanFactory更加强大,ApplicationContext还基础了其他接口,也就表示ApplicationContext还拥有其他功能,比如MessageSource表示国际化,ApplicationEventPublisher表示事件发布,EnvironmentCapable表示获取环境变量,等等,关于ApplicationContext后面再详细讨论。

在Spring的源码实现中,当我们new一个ApplicationContext时,其底层会new一个BeanFactory出来,当使用ApplicationContext的某些方法时,比如getBean0,底层调用的是BeanFactory的getBean()方法。

在Spring源码中,BeanFactory接口存在一个非常重要的实现类是:DefaultListableBeanFactory,也是非常核心的。

DefaultListableBeanFactory是非常强大的,支持很多功能,可以通过查看 DefaultListableBeanFactory的类继承实现结构来看

4. ApplicationContext

上面有分析到,ApplicationContext是个接口,实际上也是一个BeanFactory,不过比BeanFactory更加强大,比如:

1.HierarchicalBeanFactory:拥有获取父BeanFactory的功能

2.ListableBeanFactory:拥有获取beanNames的功能3.ResourcePatternResolver:资源加载器,可以一次性获取多个资源(文件资源等等)

4.EnvironmentCapable:可以获取运行时环境(没有设置运行时环境功能)

5.ApplicationEventPublisher:拥有广播事件的功能(没有添加事件监听器的功能)

6.MessageSource:拥有国际化功能

ApplicationContext 有两个比较重要的实现类:

1.AnnotationConfig ApplicationContext

2.ClassPathXmlApplicationContext

4.1 AnnotationConfig ApplicationContext

  1. ConfigurableApplicationContext:继承了ApplicationContext接口,增加了,添加事件监听器、添加BeanFactoryPostProcessor、设置Environment,获取ConfigurableListableBeanFactory等功能
  2. AbstractApplicationContext:实现了ConfigurableApplicationContext接口
  3. GenericApplicationContext:继承了AbstractApplicationContext,实现了BeanDefinitionRegistry接口,拥有了所有ApplicationContext的功能,并且可以注册BeanDefinition,注意这个类中有一个属性(DefaultListableBeanFactory beanFactory)
  4. AnnotationConfigRegistry:可以单独注册某个为类为BeanDefinition(可以处理该类上的
    @Configuration注解,已经可以处理@Bean注解),同时可以扫描
  5. AnnotationConfig ApplicationContext:继承了GenericApplicationContext,实现了AnnotationConfigRegistry接口,拥有了以上所有的功能

4.2 ClassPathXmlApplicationContext

它也是继承了AbstractApplicationContext,但是相对于AnnotationConfigApplicationContext而言,功能没有AnnotationConfig ApplicationContext强大,比如不能注册BeanDefinition

5. BeanPostProcessor

BeanPostProcess表示Bena的后置处理器,我们可以定义一个或多个BeanPostProcessor,比如通过一下代码定义一个BeanPostProcessor:

一个BeanPostProcessor可以在任意一个Bean的初始化之前以及初始化之后去额外的做一些用户自定义的逻辑,当然,我们可以通过判断beanName来进行针对性处理(针对某个Bean,或某部分Bean)。

我们可以通过定义BeanPostProcessor来干涉Spring创建Bean的过程。

6. BeanFactoryPostProcessor

BeanFactoryPostProcessor表示Bean工厂的后置处理器,其实和BeanPostProcessor类似,BeanPostProcessor是干涉Bean的创建过程,BeanFactoryPostProcessor是干涉BeanFactory的创建过程。

7. FactoryBean

上面提到,我们可以通过BeanPostPorcessor来干涉Spring创建Bean的过程,但是如果我们想一个Bean完完全全由我们来创造,也是可以的,比如通过FactoryBean:

通过上面这段代码,我们自己创造了一个UserService对象,并且它将成为Bean。但是通过这种方式创造出来的UserService的Bean,只会经过初始化后,其他Spring的生命周期步骤是不会经过的,比如依赖注入。

有同学可能会想到,通过@Bean也可以自己生成一个对象作为Bean,那么和FactoryBean的区别是什么呢?其实在很多场景下他俩是可以替换的,但是站在原理层面来说的,区别很明显,@Bean定义的Bean是会经过完整的Bean生命周期的。

8.ExcludeFilter和IncludeFilter

这两个Filter是Spring扫描过程中用来过滤的。ExcludeFilter表示排除过滤器,IncludeFilter表示包含过滤器。

比如以下配置,表示扫描com.zhouyu这个包下面的所有类,但是排除UserService类,也就是就算它上面有@Component注解也不会成为Bean。

再比如以下配置,就算UserService类上没有@Component注解,它也会被扫描成为一个Bean。

FilterType分为:

1.ANNOTATION:表示是否包含某个注解

2.ASSIGNABLE TYPE:表示是否是某个类

3.ASPECTJ:表示否是符合某个Aspectj表达式

4.REGEX:表示是否符合某个正则表达式

5.CUSTOM:自定义

在Spring的扫描逻辑中,默认会添加一个Annotation TypeFilter给includeFilters,表示默认情况下Spring扫描过程中会认为类上有@Component注解的就是Bean。

9. MetadataReader、ClassMetadata、Annotation Metadata

在Spring中需要去解析类的信息,比如类名、类中的方法、类上的注解,这些都可以称之为类的元数据,所以Spring中对类的元数据做了抽象,并提供了一些工具类。

MetadataReader表示类的元数据读取器,默认实现类为SimpleMetadataReader

需要注意的是,SimpleMetadataReader去解析类时,使用的ASM技术。

为什么要使用ASM技术,Spring启动的时候需要去扫描,如果指定的包路径比较宽泛,那么扫描的类是非常多的,那如果在Spring启动时就把这些类全部加载进JVM了,这样不太好,所以使用了ASM技术。

别再手动找触点了!EPLAN线圈触点映像的3种显示方式与F键/Ctrl+B快捷键实战 本文详细解析EPLAN线圈触点映像的3种显示方式与F键/Ctrl+B快捷键实战技巧,帮助电气设计工程师提升图纸操作效率。通过精简编号、路径栏显示和元件旁可视化三种模式的应用场景对比,结合快捷键肌肉记忆训练法,实现触点快速定位与管理,大幅减少手动查找时间。 阅读详情

相关推荐

CAN接受和发送失败的原因有哪些---之前调试MCP2515驱动时,数据一直发不出去,三个发送邮箱都被占满.至今未解决,读寄存器-总线错误

0.CAN总线错误分析与解决–讲的最精辟的放在最前面 我们知道CAN总线上的每个节点往总线上发送数据的同时会同时读取总线上的数据,并与自己发送的数据作对比。—CAN仲裁??? CAN总线错误分别有发送和接收错误计数,计数达到一定的累计以后就会产生CAN BUS OFF, 这说明CAN总线上出现了严重的错误。如下图CAN总线产生错误后的状态转换机制 如果出现了BUS OFF,总线上的节点需要做一些动作,例如重启CAN控制器或是重新上电,但是这些都只是一些补救措施,最根本的还是需要找到引起BUS OFF的根源

dianqicyuyan的博客 2万+

Spring专题(一)——初识ApplicationContext、BeanFactory、BeanDefinition、BeanPostProcessor等对象

初识ApplicationContext、BeanFactory、BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor、BeanDefinition、BeanPostProcessor对象。认识Spring中上述对象,可以对Spring框架有一个总体的认识。 ApplicationContext ApplicationContext是Spring的上下文对象,就是我们常说的Spring容器。ApplicationContext是.

qq_41426990的博客 992

基于python的排课表系统,用python编写排课系统

实现一个具体的课程管理系统。(5) 学生可以查看自己选上的课的成绩,以及各个课程的得分、绩点,并给出其平均绩点,但不允许查看年级其他人的成绩。(2) 学生定制专属课表,可以查看整个学期本人的课程安排,包括课程名称、上课时间、上课地点、任课老师、学分等等。(13) 系主任可以查看整个系的全部学生以及他们的平均绩点,可以对每个班进行排名,或者也可以对整个系进行排名。(15) 系主任可以查看整个学期所开设的所有课程,包括这些课程的全部详细信息。(1) 学生基本信息的查询,学生可以对本人的系统登陆密码进行修改。

yang0728y的博客 1999

spring中的BeanFactory与ApplicationContext的作用和区别?

1.作用: 1)BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。 BeanFactory是spring的原始接口,针对原始结构的实现类功能比较单一,BeanFactory接口实现的容器,特点是在每次获取对象时才会创建对象 2)ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: a. 国际化支持 ...

花&败 1923

一文搞懂雷达脉冲压缩和匹配滤波器

为了解决传统单频脉冲雷达面临的作用距离和空间分辨力之间的矛盾,脉冲压缩理论被提出。在接收端设计一个和发射信号能够“共轭匹配”的网络来实现脉冲压缩。接收到的回波信号通过匹配滤波器时,滤波器的增益在信号越强的频率点越大;在信号越弱的频率点,增益越小,通过这样的方式使信号在时域更加集中。脉冲压缩技术大致可分为线性调频(LFM)和相位编码。其中LFM信号易于通过硬件或各种技术产生,但是进行匹配滤波后主旁瓣比高达13.2dB,在检测多个目标时,强目标的回波旁瓣可能会把弱小信号覆盖,导致弱小信号的检测受到影响。

FPGA入门到跑路 9937

ArduSub深度调参指南:如何让水下机器人像鱼一样稳定游动

本文深入探讨了ArduSub水下机器人的深度调参策略,旨在解决ROV在水下晃动、响应迟钝等问题。文章系统解析了级联PID控制逻辑,并针对静水与水流环境,提供了具体的深度保持与姿态控制调参方法、实战日志分析技巧以及异常振荡处理方案,帮助用户实现水下机器人稳定、流畅的游动性能。

CAT789的专栏 372

Spring BeanFactory、ApplicationContext层次结构和BeanDefinition解析过程

先说层次架构 // 水桶和上下文类层次概要(还有如何打水) // 当你在使用FileSystemXmlApplicationContext之类的类时,你会感觉里面的方法调用错综复杂,层次很多。 // 那么,我们先从主要类的作用和层次说起,让我们有个大体的概念和印象,便于后面的分析。 class Waterpot { // 水桶: // 顺序基本是按照继承的先后顺序 // *****...

kerlubasola 297

ESP32内存优化实战:关闭WiFi/LWIP功能释放37KB IRAM的隐藏技巧

本文针对ESP32开发中IRAM内存不足的难题,提供了一种通过关闭WiFi和LWIP协议栈的IRAM优化功能来释放宝贵内存空间的实战技巧。该方法最高可释放约37KB的IRAM,有效解决复杂项目(如WiFi+BLE+语音识别)的编译失败问题,并详细阐述了配置步骤、性能权衡与测试验证方法。

redis7keeper的博客 131

Android Android之Launcher的小试心得(转)

Launcher是Android系统的"桌面",在android2.1之前采用的是launcher,android2.2之后采用的launcher2,他们之间最大的区别是launcher2有3D效果,不过launcher2整个系统的代码的改动还是比较大的。 首先来介绍下launcher目录下的几个文件吧,我做简单说明: AddAdapter:添加桌面元素的适配器。 AllAppsGridView:Icon列表的的主界面,继承gridView。 DeleteZone:luancher的删除区域,继承I

windizual的专栏 898

高精度SAR ADC设计实战:从建模到版图的16位1MSPS实现

本文详细介绍了16位1MSPS高精度SAR ADC的设计过程,从建模到版图实现的完整流程。重点探讨了分段电容阵列设计、校准算法实现及版图匹配等关键技术,展示了如何在180nm工艺下实现92.5dB SNDR和109.6dB SFDR的高性能指标。文章特别强调了整数桥接电容设计对提升匹配精度的关键作用,为高精度模数转换器设计提供了实用参考。

weixin_33724046的博客 437

从ViT到CLIP:OpenAI如何用4亿张图‘教会’AI看懂世界?一次讲透对比学习与Prompt工程

本文深入解析OpenAI的CLIP模型如何通过4亿图文对的对比学习实现跨模态理解,详细探讨了对比学习、数据构建、模型架构及Prompt工程等核心技术。CLIP利用Transformer架构和精心设计的Prompt模板,在Zero-Shot分类、图像检索等场景展现出强大能力,为多模态AI应用开辟新方向。

weixin_27027459的博客 372

Spring的BeanFactory和ApplicationContext

BeanFactory和ApplicationContextBeanFactory第一梯队第二梯队ListableBeanFactoryHierarchicalBeanFactory第三梯队ConfigurableBeanFactory第四梯队AutowireCapableBeanFactoryAbstractBeanFactory第五梯队ConfigurableListableBeanFactoryAbstractAutowireCapableBeanFactory第六梯队DefaultListableB

Ralap的博客 980

多角度模板匹配的模板创建技巧

基于形状的模板匹配多角度创建技巧

manuoo的专栏 3403

Spring核心概念指南

新手友好的Spring框架核心概念详解,包含Bean、DTO、Entity、JPA和事务管理等。

qq_31619295的博客 1182

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

Spring Boot 核心概念

Spring Boot 是一个功能强大的框架,它通过简化配置、提供自动化工具以及集成常用功能,大幅提升了 Java 开发效率。通过理解 Spring Boot 的核心概念和机制,开发者可以快速构建高效、可维护的企业级应用。自动配置:减少配置工作,专注于业务逻辑。嵌入式服务器:快速部署和运行。数据访问:通过 Spring Data JPA 快速实现 CRUD 操作。监控管理:Actuator 提供全面的应用监控能力。

Flying_Fish_roe的博客 1537

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring的核心概念

Spring的核心概念 这篇文章适合初入门java后端的朋友,主要是介绍一些基本的概念,读完后对spring有个总体的把握。 一、Spring是什么?常见的SpringMVC, SpringBoot, SpringCloud是什么?他们之间的关系? Spring是一个“引擎” 。 SpringMVC是基于Spring的一个MVC框架,主要解决web开发的问题。 SpringBoot是基于Sprin...

Angleaid的专栏 286

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring核心概念总结

Spring核心概念总结如图

编程小菜的博客 206

0、Spring核心概念

Spring核心概念 IOC:控制反转,inversion of control DI:依赖注入 AOP:面向切面编程,Aspect-Oriented Programming BeanDefinition:Bean定义 BeanDefinitionMap:用来存BeanDefinition。结构Map singletonObjects:单例池,用来存单例对象。结构Map BeanPostProcessor:bean后置处理器。每个

weixin_45607813的博客 2661

Java 的 Spring 框架核心概念与实践

1.背景介绍 Spring 框架是 Java 应用程序的一种流行的基础设施。它提供了一种简化 Java 企业级应用程序开发的方法,使开发人员能够更快地构建可扩展和可维护的应用程序。Spring 框架的核心概念包括依赖注入(DI)、面向切面编程(AOP)、事件驱动编程和数据访问抽象。 在本文中,我们将讨论 Spring 框架的核心概念、联系和实践。我们将从 Spring 框架的背景和历史开始,然...

AI天才研究院 921

Spring核心概念

前言 Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 月首次在 Apache 2.0 许可下发布。 Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小。 下...

chenjia的博客 1492

【Spring】核心概念

在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入业务层要用数据层的类对象,以前是自己 new 的现在自己不new了,靠 别人[外部其实指的就是IOC容器] 来给注入进来这种思想就是依赖注入1.使用IOC容器管理bean(IOC2.在IOC容器内将有依赖关系的bean进行关系绑定(DI最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系.(1)什么IOC/DI思想?

m0_73956614的博客 715

Spring的核心概念汇总

Spring的BeanFactory是Spring框架中的一个核心接口,用于管理和获取Bean对象的实例。BeanFactory提供了一种创建、配置和管理Bean的机制,它是Spring IoC容器的基础。Bean的创建和管理:BeanFactory负责创建和管理Bean的生命周期。它根据配置信息创建Bean的实例,并在需要时进行初始化和销毁。Bean的依赖注入:BeanFactory负责管理Bean之间的依赖关系。它可以自动将依赖的Bean注入到目标Bean中,实现松耦合的编程。

GreyWings的博客 375

Spring的核心概念。

Spring核心概念 1、Spring主要用到两种设计模式 1.1工厂模式 Spring容器就是实例化和管理全部Bean的工厂。 工厂模式可以将Java对象的调用者从被调用者的实现逻辑中分离出来。 调用者只关心被调用者必须满足的某种规则,这里的规则我们可以看做是接口,而不必关心实例的具体实现过程,具体实现由Bean工厂完成。 1.2单例模式 Spring默认将所有的B...

yihuliunian的博客 177

spring核心概念介绍

Spring容器: Spring容器是Spring框架的核心组件,它负责创建、配置和管理Bean。在Spring中,DI是通过Spring容器在运行时将依赖对象注入到被依赖对象中的过程。Spring框架提供了对AOP的强大支持,通过AOP,你可以更加专注于业务逻辑的实现,而无需关心横切关注点的实现细节。Spring Boot: 虽然Spring Boot不是Spring框架的核心概念,但它是基于Spring框架的一个全新项目,旨在简化Spring应用的初始搭建以及开发过程。

weixin_57763462的博客 524

spring核心概念

IOC(Inversion of Control)——控制反转         首先介绍IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,

basycai的博客 3649
上一篇: SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么?
下一篇: Tomcat深入浅出——Session与Cookie
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值