java spring源码_spring源码分析-spring中的bean

接触过spring的人都知道,在spring中我们称java对象为bean,我们在spring的debug日志或者报错日志也能看到各种bean的描述。其实,spring的bean和java的对象之间是有区别的,很难简单的描述他们的关系,可以说一样,也可以说是不一样的。下面我们就来扯一扯

java对象

在说java对象前我们先来看一幅图

563ceadc1a7c1cfb69dd812858d263fd.png

稍微熟悉java的同学肯定一看就明白,这么简单!不错是很简单,我们每天就在干这样的事情,但是我们如果要往深里看其实还是很复杂的过程:

我们在IDE里面编辑好我们的java类-xxx.java

编译xxx。java->xxx.class,这里面涉及到编译原理的内容

编译完的xxx.class文件在java 虚拟机方法区创建Class类的实例

当我们new一个对象的时候,根据方法区中的Class实例创建xxx类的实例对象

至此,我们完成了类xxx的一个对象的创建,在这过程中,会经历java类的加载过程,java对象的创建过程等系列步骤。这个过程很复杂,这里不展开,有机会会单独讲述。

spring bean

在spring中,我们实例化一个bean的过程就复杂很多,我们先来看幅简图

4eb44116859067d177f527cd0b24ea6e.png

有没有发现和上面的图差不多,就是多了几个步骤。确实哈哈,其实spring实例化bean的远比这个复杂,我们先熟悉一下大致过程,具体的过程后面文章再详细讨论。

我们以注解为例,spring中的bean是扫描我们的注解类,然后进行实例化,并将实例化后的对象放到spring容器中。注意这句话,其中扫描、实例化、放进容器,这几个都是关键词。后面文件会一一讲述。我们现在讨论的是实例化,我们可以这么想象,在spring中对扫描到的所有类,是否立即实例化并放到容器中?大家可以想一想。................5秒钟过去了,我就不卖关子了,其实是不能立即放到容器中的,如果队spring做过扩展的同学可能会对各种后置处理器有印象,实现了BeanFactoryPostProcessor和BeanPostProcessor的各种类,这些后置处理器是能动态的改变对象的所有信息,没错,是所有信息。也就是说spring中的bean是在java对象的基础上做了很多spring的处理,简单来说一句话:spring中的bean一定是一个java对象,但是java对象不一定是spring的bean。可能这个不是很严谨,大家姑且这么听着,只要能理解两者之间的关系就行。

BeanDefinition

上文描述了java读写和spring bean的区别,我们知道了spring中一个bean所经历的过程要比java对象长且复杂很多,我们来看一个栗子:

45b1b6a79adaff31f6186aba1759e9be.png

0f7e5b7f5cd8fb217d4cffbad619e33d.png

b3ed8103b19382b7f621fb513ccf512b.png

我们提供了2个类:A和B,都是空类,啥也没干。但是A类上面有Component注解,B类没有我们跑下下面的程序

3dc6b9ddc90653dcabb58eca7d32cc19.png

顺理成章结果打印了A类的bean描述。但是我现在类做一个改变,新增一个类

fe403592e9778375342fd698a7c1d443.png

我们再来看结果:

27260a4503df4ad1785db2721b79e056.png

我靠,怎么打印了B的描述,而报A不存在???我明明是在A上加了注解,B类上什么都没干,它仅仅是个java普通类。仔细看我新增的那个类,聪明的你可能会发现一点端倪,尽管可能不大明白,没关系,后面会讲。

通过这个栗子我们可以得出2个结论:

证明了上面的观点,spring的bean是可以被改变的,它不是简单的java创建对象。

spring中能做到这样,应该是借助了什么中间力量来实现的,就好比本栗子中的代码中我们发现一个对象:BeanDefinition。没错,我们说了这么多就是想引出这个哈哈,她至关重要,可以这么说,在spring中,没有她你就很难做到spring容器托管对象。

至此我们知道了一个普通java对象和spring bean的关系,我们也知道了spring中bean是有生命周期的,同时发现spring中有个神秘的BeanDefinition存在。至于它是用来干什么的现在还不知道,不过没关系,下篇文章就讲BeanDefinition,敬请期待。

PS:上面都是基于spring中的单例模式(singletom)讲述的,原型的会不一样,不过在实际工作中,谁用过原型呢?很少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBean生命周期是由Spring容器负责管理的,主要包括以下阶段: 1. 实例化:Spring容器根据配置信息或注解,创建Bean的实例。这一过程一般通过Java反射机制实现。 2. 属性注入:Spring容器将依赖注入到Bean的属性,可以通过构造函数、Setter方法或者字段注入来实现。 3. 初始化:在Bean实例创建完成后,Spring容器会调用一系列的初始化回调方法。常见的初始化回调方法有`@PostConstruct`注解、`InitializingBean`接口的`afterPropertiesSet()`方法以及自定义的初始化方法。 4. 使用:Bean实例被使用,执行业务逻辑。 5. 销毁:当Bean不再被使用时,Spring容器会调用一系列的销毁回调方法。常见的销毁回调方法有`@PreDestroy`注解、`DisposableBean`接口的`destroy()`方法以及自定义的销毁方法。 下面是一个简化的示例代码,展示了Bean生命周期的常用方法: ```java public class MyBean implements InitializingBean, DisposableBean { private String name; public MyBean() { System.out.println("Bean实例化"); } public void setName(String name) { this.name = name; } @Override public void afterPropertiesSet() throws Exception { System.out.println("初始化回调方法"); } public void doSomething() { System.out.println("执行业务逻辑:" + name); } @Override public void destroy() throws Exception { System.out.println("销毁回调方法"); } } ``` 此外,Spring还提供了更细粒度的扩展点,如BeanPostProcessor接口和BeanFactoryPostProcessor接口,可以在Bean的实例化和初始化过程进行自定义处理。 以上是一个简单的概述,实际的分析涉及到Spring框架的很多细节,包括BeanDefinition、BeanFactory、ApplicationContext等。你可以参考Spring码来深入了解Bean生命周期的实现细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值