Spring - IOC源码分析(一)

Spring IoC 源码分析 (基于注解) 一 一、 IoC 理论 IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。 二、IoC方式 Spring为IoC提供了2种方式,一种是基于xml,另一种是基于注解。 标签来定义bean,进行管理。 @Bean注解来定义bean,进行管理。 本次文章我们就来分析下基于注解的IoC原理,在看文章之前我们可以带一些疑问,这样有助于我们更好的理解。 @Bean是干什么用的? @Controller、@Se 阅读详情

SpringIOC的核心思想

IOC的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处,第一,资源集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。

Spring IOC容器的加载过程

public class MainStat {

	public static void main(String[] args) {
		ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
		UserServiceImpl bean = context.getBean(UserServiceImpl.class);
		bean.sayHi();

		Car car = context.getBean(Car.class);
		car.say();
	}

}

MainConfig配置类

@Configuration
@ComponentScan("com.spring.ioc.service")
public class MainConfig {
}

MainConfig配置类主要是用于扫描整个包
在这里插入图片描述

UserServiceImpl 类

@Service
public class UserServiceImpl {

	public void sayHi(){
		System.out.println("234879872384sdfsdf!");
	}
}

1、实例化容器:AnnotationConfigApplicationContext

从这里出发:

ApplicationContext context = new AnnotationConfigApplicationContext(MainStat.class);
  • AnnotationConfigApplicationContext的结构关系
    在这里插入图片描述
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		/**
		 * 这个this()方法是调用该类的父类GenericApplicationContext的构造器,主要作用是实现了三点
		 * ①实例化一个bean工厂,在父类GenericApplicationContext中实例化的
		 * ②获取bean定义的读取器reader,这个里面注册了很多后置处理器,尤其是ConfigurationClassPostProcessor处理器,该处理器主要解析配置类
		 * ③ scanner的用处不是很大,它仅仅是在我们外部手动调用 .scan 等方法才有用,常规方式是不会用到scanner对象的
		 * 
		 *
		 * 	 (1)DefaultListableBeanFactory
		 * 			* 注册bean定义
		 * 			* 实现BeanFactory接口、实现了BeanDefinitionRegistry(注册bean定义)
		 */
		this();
		/**
		 * 注册我们的配置类
		 */
		register(componentClasses);

		/**
		 * 刷新
		 */
		refresh();
	}

this()方法对应的构造器结构:

/**
	 * Create a new AnnotationConfigApplicationContext that needs to be populated
	 * through {@link #register} calls and then manually {@linkplain #refresh refreshed}.
	 *
	 * 该构造器的作用:
	 * 1、实例化了一个bean工厂
	 * 2、注册了很多处理器(bean定义)
	 * 3、scanner的用处不是很大,它仅仅是在我们外部手动调用 .scan 等方法才有用,常规方式是不会用到scanner对象的
	 */
	public AnnotationConfigApplicationContext() {
		/**
		 * 创建一个读取注解的Bean定义读取器reader
		 * 完成了spring内部BeanDefinition的注册(主要是后置处理器)
		 */
		this.reader = new AnnotatedBeanDefinitionReader(this);

		/**
		 * 创建BeanDefinition扫描器
		 * 可以用来扫描包或者类
		 *
		 * spring默认的扫描包不是这个scanner对象
		 * 而是自己new的一个ClassPathBeanDefinitionScanner
		 * 这里的scanner仅仅是为了程序员可以手动调用AnnotationConfigApplicationContext
		 * 对象的scan方法
		 *
		 */
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}

我们先来为构造方法做一个简单的说明:
1、scanner的用处不是很大,它仅仅是在我们外部手动调用 .scan 等方法才有用,常规方式是不会用到scanner对象的
2、 这个配置类有两种情况,一种是传统意义上的带上@Configuration注解的配置类,还有一种是没有带上@Configuration,但是带有@Component,@Import,@ImportResouce,@Service,
@ComponentScan等注解的配置类
,在Spring内部把前者称为Full配置类,把后者称之为Lite配置类。在本源码分析中,有些地方也把Lite配置类称为普通Bean。使用断点调试,通过this()调用此类无参的构造方法,代码到下面:

public class AnnotationConfigApplicationContext extends GenericApplicationContext implements Annotatio
nConfigRegistry {

 //注解bean定义读取器,主要作用是用来读取被注解的了bean
 private final AnnotatedBeanDefinitionReader reader;

 //扫描器,它仅仅是在我们外部手动调用 .scan 等方法才有用,常规方式是不会用到scanner对象的
 private final ClassPathBeanDefinitionScanner scanner;

 /**
 * Create a new AnnotationConfigApplicationContext that needs to be populated
 * through {@link #register} calls and then manually {@linkplain #refresh refreshed}.
 */
public AnnotationConfigApplicationContext() {
 //会隐式调用父类的构造方法,初始化DefaultListableBeanFactory

 //初始化一个Bean读取器
 this.reader = new AnnotatedBeanDefinitionReader(this);

 //初始化一个扫描器,它仅仅是在我们外部手动调用 .scan 等方法才有用,常规方式是不会用到scanner对象的
 this.scanner = new ClassPathBeanDefinitionScanner(this);
 }
 }

首先无参构造方法中就是对读取器reader和扫描器scanner进行了实例化,reader的类型是AnnotatedBeanDefinitionReader,可以看出它是一个 “打了注解的Bean定义读取器”,scanner的类型是ClassPathBeanDefinitionScanner,它仅仅是在外面手动调用.scan方法,或者调用参数为String的构造方法,传入需要扫描的包名才会用到,像这样方式传入的配置类是不会用到这个scanner对象的。AnnotationConfigApplicationContext类是有继承关系的,会隐式调用父类的构造方法
下面代码:

2、实例化工厂:DefaultListableBeanFactory

public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {

	private final DefaultListableBeanFactory beanFactory;

	@Nullable
	private ResourceLoader resourceLoader;

	private boolean customClassLoader = false;

	private final AtomicBoolean refreshed = new AtomicBoolean();


	/**
	 * Create a new GenericApplicationContext.
	 * @see #registerBeanDefinition
	 * @see #refresh
	 *
	 * 实例化一个bean工厂
	 */
	public GenericApplicationContext() {
		this.beanFactory = new DefaultListableBeanFactory();
	}

DefaultListableBeanFactory的关系图
在这里插入图片描述
DefaultListableBeanFactory是相当重要的,从字面意思就可以看出它是一个Bean的工厂,什么是Bean的工厂?当然就是用来生产和获得Bean的

3、实例化BeanDefinition读取器:AnnotatedBeanDefinitionReader:

其主要做了2件事
1.注册内置BeanPostProcessor
2.注册相关的BeanDefinition
在这里插入图片描述

让我们把目光回到AnnotationConfigApplicationContext的无参构造方法,让我们看看Spring在初始化AnnotatedBeanDefinitionReader的时候做了什么:

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
		this(registry, getOrCreateEnvironment(registry));
	}

这里的BeanDefinitionRegistry当然就是AnnotationConfigApplicationContext的实例了,这里又直接调用了此类其他的构造方法。

	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		Assert.notNull(environment, "Environment must not be null");
		this.registry = registry;
		this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
		AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
	}

让我们把目光移动到这个方法的最后一行,进入registerAnnotationConfigProcessors方法

public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
		registerAnnotationConfigProcessors(registry, null);
	}

这又是一个门面方法,再点进去,这个方法的返回值Set,但是上游方法并没有去接收这个返回值,所以这个方法的返回值也不是很重要了,当然方法内部给这个返回值赋值也不重要了。由于这个方法内容比较多,这里就把最核心的贴出来,这个方法的核心就是注册Spring内置的多个Bean。

/**
		 * 为我们容器中注册了解析配置类的后置处理器
		 * 	这个internalConfigurationAnnotationProcessor类中,
		 * 	会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解
		 * 	主要负责处理配置类
		 */
		if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

1、判断容器中是否已经存在了ConfigurationClassPostProcessor Bean
2、如果不存在(当然这里肯定是不存在的),就通过RootBeanDefinition的构造方法获得ConfigurationClassPostProcessor的BeanDefinition,RootBeanDefinition是BeanDefinition的子类。
3、执行registerPostProcessor方法,registerPostProcessor方法内部就是注册Bean,当然这里注册其他Bean也是一样的流程。

BeanDefinition是什么?
BeanDefinition联系图
1、向上
在这里插入图片描述

  • BeanMetadataElement接口:BeanDefinition元数据,返回该Bean的来源
  • AttributeAccessor接口:提供对BeanDefinition属性操作能力

2、向下
在这里插入图片描述
它是用来描述Bean的,里面存放着关于Bean的一系列信息,比如Bean的作用域,Bean所对应的Class,是否懒加载,是否Primary等等,这个BeanDefinition也相当重要,我们以后会常常和它打交道。

registerPostProcessor方法:

private static BeanDefinitionHolder registerPostProcessor(
			BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {

		definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		registry.registerBeanDefinition(beanName, definition);
		return new BeanDefinitionHolder(definition, beanName);
	}

这方法为BeanDefinition设置了一个Role,ROLE_INFRASTRUCTURE代表这是spring内部的,并非用户定义的,然后又调用了registerBeanDefinition方法,再点进去,Oh No,你会发现它是一个接口,没办法直接点进去了,首先要知道registry实现类是什么,那么它的实现是什么呢?答案是DefaultListableBeanFactory:

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
 throws BeanDefinitionStoreException {
 this.beanFactory.registerBeanDefinition(beanName, beanDefinition);
 }

这又是一个门面方法,再点进去,核心在于下面两行代码

 //beanDefinitionMap是Map<String, BeanDefinition>,
 //这里就是把beanName作为key,ScopedProxyMode作为value,推到map里面
 this.beanDefinitionMap.put(beanName, beanDefinition);

 //beanDefinitionNames就是一个List<String>,这里就是把beanName放到List中去
 this.beanDefinitionNames.add(beanName);

beanDefinitionMap:

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

beanDefinitionNames:

private volatile List<String> beanDefinitionNames = new ArrayList<>(256);

在这里插入图片描述

从这里可以看出DefaultListableBeanFactory就是我们所说的容器了,里面放着beanDefinitionMap,beanDefinitionNames,beanDefinitionMap是一个hashMap,beanName作为Key,beanDefinition作为Value,beanDefinitionNames是一个集合,里面存放了beanName

DefaultListableBeanFactory中的beanDefinitionMap,beanDefinitionNames也是相当重要的,以后会经常看到它,最好看到它,第一时间就可以反应出它里面放了什么数据

这里仅仅是注册,可以简单的理解为把一些原料放入工厂,工厂还没有真正的去生产
上面已经介绍过,这里会一连串注册好几个Bean,在这其中最重要的一个Bean(没有之一)就是BeanDefinitionRegistryPostProcessor Bean

ConfigurationClassPostProcessor实现BeanDefinitionRegistryPostProcessor接口,BeanDefinitionRegistryPostProcessor接口又扩展了BeanFactoryPostProcessor接口,BeanFactoryPostProcessor是Spring的扩展点之一,ConfigurationClassPostProcessor是Spring极为重要的一个类,必须牢牢的记住上面所说的这个类和它的继承关系
在这里插入图片描述
除了注册了ConfigurationClassPostProcessor,还注册了其他Bean,其他Bean也都实现了其他接口,比如BeanPostProcessor等.
BeanPostProcessor接口也是Spring的扩展点之一
至此,实例化AnnotatedBeanDefinitionReader reader分析完毕

Spring学习总结(29)——Spring异步处理@Async的使用以及原理、源码分析(@EnableAsync) 在开发过程中,我们会遇到很多使用线程池的业务场景,例如异步短信通知、异步记录操作日志。大多数使用线程池的场景,就是会将一些可以进行异步操作的业务放在线程池中去完成。例如在生成订单的时候给用户发送短信,生成订单的结果不应该被发送短信的成功与否所左右,也就是说生成订单这个主操作是不依赖于发送短信这个操作,所以我们就可以把发送短信这个操作置为异步操作。那么本文就是来看看Spring中提供的优雅的异步处理... 阅读详情

相关推荐

CASIA数据集解析:图像篡改检测的黄金标准与实践指南

本文深入解析了CASIA数据集在图像篡改检测领域的核心价值与应用实践。作为中科院自动化所打造的黄金标准,CASIA数据集通过模拟真实篡改场景(如拼接和复制移动)为研究者提供全面支持。文章详细对比了v1.0与v2.0版本差异,分享数据预处理和模型训练的最佳实践,并探讨了未来研究方向,是图像篡改检测领域的重要参考指南。

kappa的博客 784

spring 源码系列(四)spring中的重要类介绍

目录 一、BeanDefinition 二、BeanFactory和FactoryBean BeanFactory FactoryBean 三、BeanFactoryPostProcessor BeanDefinitionRegistryPostProcessor 四、BeanPostProcessor 总结 spring源码非常负责,如果想阅读好spring源码,那么一些重要类...

linhui258的博客 1380

OLLAMA_HOST环境变量设置全攻略:从127.0.0.1到局域网共享的完整配置

本文详细解析了OLLAMA_HOST环境变量的核心作用与配置方法,指导用户如何将Ollama服务从仅限本机访问(127.0.0.1)扩展到局域网共享。文章涵盖了macOS、Linux、Windows三大平台的实战配置步骤,并提供了安全加固、性能优化及常见故障排查方案,是解决多设备协作访问本地AI模型的完整指南。

weixin_28455801的博客 1897

Spring Framework 源码阅读(二):BeanDefinition的作用

Spring Framework 源码阅读(二):BeanDefinition接口的作用 BeanDefinition接口的定义: package org.springframework.beans.factory.config; import org.springframework.beans.BeanMetadataElement; import org.springframework.beans.MutablePropertyValues; import org.springframework.co

kaven 1975

使用kmplot在线进行生存分析

欢迎关注”生信修炼手册”!kmplot是一个生存分析的在线工具,最初是设计用来对肝癌中的miRNA进行生存分析,对应的文章发表在scientific reports上,链接如下https...

庐州月光的博客 1万+

HAL库STM32CubeMX+DHT11温湿度传感器模块化驱动与OLED显示实战

本文详细介绍了基于HAL库和STM32CubeMX开发DHT11温湿度传感器模块化驱动的实战过程。通过精确的时序控制和模块化封装,实现了传感器数据采集,并结合OLED显示模块实时展示温湿度信息,为嵌入式开发者提供了完整的解决方案。

h6j7k8l9p0的博客 1134

Spring事务如何基于SpringAOP来实现事务代理?

通常我们要开启spring的事务我们需要加上@EnableTransactionManagement这个注解,那么肯定的这个注解的作用就是往容器里面去import了一个组件从而使得方法上面的@Transaction注解生效,而且spring事务的原理也是基于代理去实现事务回滚,事务隔离等功能的,那么既然是基于代理的原理,spring的事务与springAOP在实现这方面上有何异曲同工之处呢? 首先来看看@EnableTransactionManagement这个注解做了什么事 @Override .

我神级欧文的博客 1616

从 SEGW 到 SADL 的那根线,彻底理解 OData Data Source Mapping

本文摘要(150字): 在SAP Gateway的SADL型OData服务开发中,"Map to Data Source"是关键配置环节。与传统RFC映射不同,SADL映射不是针对单个CRUDQ操作,而是建立OData模型与SADL业务实体间的完整语义对应关系。通过属性映射和关联映射,系统能自动处理数据获取和导航请求。映射编辑器支持三种模式:属性映射处理字段对应,关联映射处理模型间关系,动作映射处理业务操作。映射的本质是建立语义翻译表,决定了后续OData请求如何转化为后端业务实体访问,而非简单的字段重命名

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 61

springboot注解(全)

Spring Boot是一个快速开发框架,快速的将一些常用的第三方依赖整合(通过Maven子父亲工程的方式),简化xml配置,全部采用注解形式,内置Http服务器(Jetty和Tomcat),最终以Java应用程序进行执行。

zhaoshuangjian 7283

33、AI赋能5G/6G通信:LDPC码解码与强化学习技术解析

本文探讨了基于AI和强化学习的LDPC码技术在5G/6G通信中的应用。包括LAMS解码器、神经MS解码器、盲识别方法、统一极性-LDPC解码器、NNMS和SNNMS解码器、N-2D-NMS解码器、神经分层MS解码器、MAB-NS方案以及强化学习与MCTS结合的技术。这些技术在提升解码性能、降低计算复杂度和增强系统适应性方面表现出色,为未来通信系统的发展提供了强有力的支持。

lambda的博客 242

ThingsBoard 场景联动需求

当初有个兄弟请我帮他实现一个需求,需求如上,很简单,实现完成后我怕他操作不来,又写了这份文档给他,今天把这个文档的场景发出来,大家也可以学习一下思路我把需要模拟设备的指令都总结在下面,连接参数截图讲解如下:温度传感器风扇光照传感器灯。

AldrichEugene 1233

Spring之IoC源码分析一

加载配置文件 例如new ClassPathXmlApplicationContext("aop.xml"); 一、将配置文件aop.xml封装为Resource 在Spring中,加载配置文件主要由BeanDefinitionReader负责 而AbstractBeanDefinitionReader实现了loadBeanDefinitions方法,代码如下(省略一些代码) 二、将Resour...

枫清的博客 300

BVH2SMPL 实战笔记

BVH2SMPL 实战笔记

jacke121的专栏 843

一、spring的IOC源码分析

一、什么是Ioc 1.IoC容器:最主要是完成了完成对象的创建和依赖的管理注入等等,其实说白了就是将new对象的动作交给Spring管理,并由Spring保存已创建的对象(IOC容器)。我们再不用通过new的方式来创建Javabean对象,这个过程就叫做控制反转。 2.先从我们自己设计这样一个视角来考虑: 所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙...

码农小默 251

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Spring源码】Spring IOC 容器源码分析(一)

本文较长,由于微信文章文字限制,IOC源码分析分为3个文章展示出来~Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的...

JAVA高级架构 442

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring 源码分析总结篇一: Spring IOC篇

一、前言 本文,全文仅代表个人理解和意见,故难免出现错误,如若发现,欢迎指正。十分谢谢。 二、Spring IOC QA 2.1 Spring IOC 实现个人感觉最重要的两个类 ConfigurationClassPostProcessor : 完成了类的扫描和配置了的解析 AutowiredAnnotationBeanPostProcessor : 完成了非 Property 的属性的注入 ConfigurationClassPostProcessor 是 BeanFactoryPost

猫吻鱼的博客 2290

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

spring源码分析(一) IOC源码分析

spring-ioc源码分析 概述:spring是一个ioc容器,ioc就是我们把对象之间的依赖关系交给spring进行管理,比如说,我们在配置文件或者java配置类定义了bean的各种关系,spring负责加载这些bean,并维护了类之间的依赖,如果我们需要使用bean,直接getBean即可,这个就是spring作为Ioc容器的主要功能。 一、类介绍 1、ApplicationContext的总览 为了分析ioc的原理,我们先从可以接触到的applicationContent类进行入手,下面这个

shuixiou1的博客 351

Spring IOC 源码分析(一)

简介 Spring最重要的概念是IOD和AOP,本篇文章带大家来分析下Spring的IOC容器。源码采用4.3.11,通过基于xml的配置的方式来解析(实际很少人这么做了,至少不是纯xml配置,不过从理解源码的角度来看这种方式比较容易理解)。下面我们开始吧! Spring源码分析图,这个看起来更清晰一点。 https://blog.youkuaiyun.com/qq_37113604/article/d...

qq_37113604的博客 426

Spring IOC之ClassPathXmlApplicationContext启动深入源码分析(一)

AnnotationConfigApplicationContext是Spring用来加载注解配置的ApplicationContext,它是如何加载所有的bean,与ClassPathXmlApplicationContext有什么区别,让我们接下来揭开它的神秘面纱。 一、类图 二、时序图 三、源码剖析 3.1 初始化IOC容器 目标类:ClassPathXmlApplicationContext // new ClassPathXmlApplicationContext("applocationCo

we.think 494

spring之IOC源码分析一

spring的ioc源码分析 欢迎使用Markdown编辑器 撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + Shift + H 无序列表:Ctrl/Command + Shift + U 有序列表:Ctrl/Command + Shift + O 检...

qq_27487267的博客 220

Spring IOC源码分析(一)

1.什么是IOC? 在面向对象系统中,对象封装了数据和对数据的处理,而对象之间的依赖关系体现在对数据和方法的依赖上。当业务 很复杂,涉及到的类非常多,这个时候如果由开发者手动的去给每个对象导入它依赖的对象,这将会导致代码高度耦 合,简直是牵一发而动全身。但如果,对象之间的依赖关系并不需要我们手动导入,而是将其交给某一个框架或者平 台来处理。这无疑会大大减少代码的耦合度,降低编码的复杂度,将应用从复杂的依赖关系中解放出来。 IOC(Inverse of Control)控制反转,有时候也被称为DI依赖注入,

qq_36500178的博客 232

「Spring源码」Spring IOC 容器源码分析(一)

Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。 本文采用的源码版本是 4.3.11.RELEASE,算是 5.0.x 前比较新的版本了。为了降低难度,本文所说的所有的内容都是基于 xml 的配置的方式,实际使用已经很少人

爱写代码的程序员 264

Spring原理与源码分析系列(一)- Spring IoC入门

一、Spring简介 什么是Spring 轻量:Spring是轻量级的,基本的版本大小为2MB 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 面向切面的编程AOP:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring包含并管理应用中对象的生命周期和配置 MVC框架: Spring-MVC 事务管理:S

noaman_wgs的博客 2366

[Spring框架]深入源码分析IOC(一)

IOC初始化之准备工作(定位、加载、注册)1、Spring基本认识2、介绍几个重要的类2.1、BeanFactory2.2、BeanDefinition2.3、ApplicationContext3、Spring容器(定位、加载、注册)总结 1、Spring基本认识 1.初衷:Spring框架一开始是为了解决开发的复杂性而存在的,所以归根结底他的目标就是四个字简化开发,这四个字几乎贯Spring,...

xujunson的博客 274

Spring源码分析(一)-Spring IoC容器的设计

Spring源码分析(一)-Spring IoC容器的设计

qq418517226的专栏 1400
上一篇: MySQL底层执行原理详解
下一篇: Spring中BeanFactory和FactoryBean的区别
程序员老石
博客等级 码龄8年 286粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值