3、Spring之底层架构核心概念解析

这篇具有很好参考价值的文章主要介绍了3、Spring之底层架构核心概念解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

BeanDefinition

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

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

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

  1. <bean/>
  2. @Bean
  3. @Component(@Service,@Controller)

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

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

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

		// 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
		AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();

		// Bean类型
		beanDefinition.setBeanClass(User.class);

		// 作用域
		beanDefinition.setScope("singleton");
		// 懒加载
		beanDefinition.setLazyInit(true);

		// 注册bean定义 beanName和Bean类型
		context.registerBeanDefinition("user", beanDefinition);

		System.out.println(context.getBean("user"));
		User user = (User) context.getBean("user");
		user.test();
	}

3、Spring之底层架构核心概念解析,spring,架构,java

 实际中用注解实现,底层是这么实现的。

BeanDefinitionReader

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

AnnotatedBeanDefinitionReader

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

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

		AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new AnnotatedBeanDefinitionReader(context);

		// 将User.class解析为BeanDefinition
		annotatedBeanDefinitionReader.register(User.class);

		System.out.println(context.getBean("user"));
		User user = (User) context.getBean("user");
		user.test();
	}

比起上面的BeanDefinition,省去了很多代码。

register方法,底层是构造BeanDefinition,解析处理类上的注解。

3、Spring之底层架构核心概念解析,spring,架构,java

 AnnotatedBeanDefinitionReader的构造器,this()方法,会创建AnnotatedBeanDefinitionReader。

3、Spring之底层架构核心概念解析,spring,架构,java

3、Spring之底层架构核心概念解析,spring,架构,java

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

XmlBeanDefinitionReader

可以解析<bean/>标签

	/**
	 * XmlBeanDefinitionReader 解析xml 配置的bean 不会扫描
	 * @param args
	 */
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

		XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);
		int i = xmlBeanDefinitionReader.loadBeanDefinitions("spring.xml");

		System.out.println(context.getBean("user"));
		User user = (User) context.getBean("user");
		user.test();
	}

3、Spring之底层架构核心概念解析,spring,架构,java

 i是数量,解析出来一个。

3、Spring之底层架构核心概念解析,spring,架构,java

ClassPathBeanDefinitionScanner

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

	/**
	 * ClassPathBeanDefinitionScanner  BeanDefinition扫描器 扫描指定目录下@Component注解修饰的类 创建BeanDefinition bean对象
	 * @param args
	 */
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
		context.refresh();

		ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
		scanner.scan("com.zhouyu");

		System.out.println(context.getBean("orderService"));
	}

3、Spring之底层架构核心概念解析,spring,架构,java

 3、Spring之底层架构核心概念解析,spring,架构,java文章来源地址https://www.toymoban.com/news/detail-661184.html

从源码可见,AnnotationConfigApplicationContext既有扫描又有直接注册功能。

到了这里,关于3、Spring之底层架构核心概念解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring】Spring底层核心原理解析

    简单代码: spring.xml内容: AppConfig.class内容: AppConfig.class替代了spring.xml文件,表示spring的配置文件; ApplicationContext在Spring、SpringMVC、SpringBoot中的创建方式: Spring,通过 ClassPathXmlApplicationContext 创建; SpringMVC,通过 XmlWebApplicationContext 创建; SpringBoot,通过 AnnotationConfigAppl

    2024年02月15日
    浏览(34)
  • Spring - Spring底层核心原理解析

    1. Bean的生命周期底层原理 2. 依赖注入底层原理 3. 初始化底层原理 4. 推断构造方法底层原理 5. AOP底层原理 6. Spring事务底层原理 对于这三行代码应该,大部分同学应该都是比较熟悉,这是学习Spring的hello world。可是,这三行代码底层都做了什么,比如: 第一行代码,会构造一

    2024年02月07日
    浏览(47)
  • Spring底层核心架构

    相关的配置类 1. user类 2. AppConfig类 3.spring.xml class,表示Bean类型 scope,表示Bean作用域,单例或原型等 lazyInit:表示Bean是否是懒加载 initMethodName:表示Bean初始化时要执行的方法 destroyMethodName:表示Bean销毁时要执行的方法 还有很多… (1)BeanDefinition简单使用 说明:AbstractBean

    2024年02月12日
    浏览(42)
  • 【Spring专题】Spring底层核心原理解析

    Spring啊,可以说是我们大部分Java玩家【最熟悉的陌生人】了吧。八个字形容:似懂非懂,会也不会 你说简单应用,我们大家都会,那真要展开说两句的话,那只能来这么两句:这是第一句,接着是第二句,好了我说完了。 但是啊xdm, 据说Spring是一份非常非常非常优秀的源码

    2024年02月13日
    浏览(46)
  • 走进Spring的世界 —— Spring底层核心原理解析(一)

    这是学习Spring的hello world。可是,这三行代码底层都做了什么,比如: 第一行代码,会构造一个ClassPathXmlApplicationContext对象,ClassPathXmlApplicationContext该如何理解,调用该构造方法除开会实例化得到一个对象,还会做哪些事情? 第二行代码,会调用ClassPathXmlApplicationContext的ge

    2024年02月07日
    浏览(55)
  • Spring源码系列:核心概念解析

    本文旨在为读者解析Spring源码中的关键类,以便读者在深入阅读源码时,能够了解关键类的作用和用途。在阅读Spring源码时,经常会遇到一些不熟悉的概念,了解关键类的作用可以帮助读者更好地理解这些概念。 BeanDefinition是Spring框架中的一个重要概念,它定义了一个Bean的基

    2023年04月20日
    浏览(47)
  • 深入解析Spring基本概念和核心思想

    使用spring后,被spring管理的类,不需要再new。 要想类被spring管理,则需要通过bean的方式,把类引入到spirng的配置文件中。 Ioc容器 简单的理解就是: 实现IoC思想,并提供对象创建,对象装配以及对象生命周期管理的软件就是Ioc容器 IoC理解 应用程序无需主动new对象,而是描述

    2024年02月12日
    浏览(46)
  • 【Spring】Spring之事务底层源码解析

    能使用spring事务解决开发需求 了解spring事务是如何被spring管理的 了解spring事务底层原理实现,比如代理、事务传播机制等 配置数据源及事务管理器: 业务逻辑代码: 调用: 结果: 如上,就是Spring中事务的简单应用,接下来分析Spring事务的实现原理。 开启Spring事务本质上

    2024年02月14日
    浏览(40)
  • 【Spring】Spring之AOP底层源码解析

    理解Spring中AOP的实现原理 Spring中有关AOP功能的使用 什么是动态代理: 为 其他对象 提供一种 代理 以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 如下一个service类,如果想不改变test方法代码的情况下,增加特定的逻辑,该怎么做呢? 此时就可以用

    2024年02月14日
    浏览(41)
  • Spring概述与核心概念学习 -- Spring入门(一)

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码以及可以在我主页的资源里找到,如果在学

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包