Spring知识(一)

1.BeanDefinition

1.1 什么是BeanDefinition?

BeanDefinition表示Bean定义

Spring根据BeanDefiniton来创建Bean对象

BeanDefinition有很多的属性用来描述Bean

BeanDefinition是Spring中非常核心的概念

1.2 BeanDifinition中重要的属性

  • beanClass:表示一个Bean的类型,比如:UserService.class、OrderService.class,Spring在创建Bean的过程中会根据此属性来实例化得到对象;
  • scope:表示一个bean的作用域,比如:
    scope等于singleton,该bean就是一个单例Bean;
    scope等于prototype,该Bean就是一个原型Bean。
  • isLazy:表示一个Bean是不是需要懒加载,原型Bean的isLazy属性不起作用,懒加载的单例Bean,会在第一次getBean的时候生成该Bean,非懒加载的单例Bean,则会在Spring启动过程中直接生成好。
  • dependsOn:表示一个Bean在创建之前所依赖的其他Bean,在一个Bean创建之前,它所依赖的Bean得先全部创建好。
  • primary:表示一个Bean是主Bean,在Spring中一个类型可以有多个Bean对象,在进行依赖注入时,如果根据类型找到了多个Bean,此时会判断这些Bean中是否存在一个主Bean,如果存在,则直接将这个Bean注入给属性。
  • initMethodName:表示一个Bean的初始化方法,一个Bean的生命周期过程中有一个步骤叫初始化,Spring会在这个步骤中去调用Bean的初始化方法初始化逻辑由程序员自己控制,表示程序员可以自己自定义逻辑对Bean进行加工。

1.3 BeanDefinition的解析

image-20220302205543616

2. BeanFactory

2.1 什么是BeanFactory?

BeanFactory是一种“Spring容器”

BeanFactory翻译过来就是Bean工厂

顾名思义,它可以用来创建Bean获取Bean

BeanFactory是Spring中非常核心的组件

2.2 工作流程

BeanFactory将利用BeanDefinition来生成Bean对象

BeanDefinition相当于BeanFactory的原材料

Bean对象就相当于BeanFactory所生产出来的产品

2.3 BeanFactory的核心子接口和实现类

  • ListableBeanFactory
  • ConfigurableBeanFactory
  • AutowireCapableBeanFactory
  • AbstractBeanFactory
  • DefaultListableBeanFactory

2.4 DefaultListableBeanFactory的功能

  • 支持单例Bean
  • 支持Bean别名
  • 支持父子BeanFactory
  • 支持Bean类型转化
  • 支持Bean后置处理
  • 支持FactoryBean
  • 支持自动装配等等

3. Bean生命周期

3.1 什么是Bean生命周期?

Bean生命周期是Spring中一个Bean创建过程销毁过程中所经历的步骤,其中Bean创建过程是重点

程序员可以利用Bean生命周期机制对Bean进行自定义加工。

3.2 核心步骤

Bean生命周期核心步骤

  • BeanDefinition:BeanDefinition表示Bean定义,它定义了某个Bean的类型,Spring就是利用BeanDefinition来创建Bean的,比如需要BeanDefinition中beanClass属性确定Bean的类型,从而实例化出来对象。
  • 构造方法判断:一个Bean中可以由多个构造方法,此时就需要Spring来判断到底使用哪个构造方法,这个过程是比较复杂的。通过构造方法推断之后确定一个构造方法后,就可以利用构造方法实例化得到一个对象了。
  • 实例化:通过构造方法反射得到一个实例化对象,在Spring中,可以通过BeanPostProcessor机制对实例化进行干预。
  • 属性填充:实例化所得到的对象,是“不完整”的对象,“不完整”的意思是该对象中的某些属性还没有进行属性填充,也就是Spring还没有自动给某些属性赋值,属性填充就是我们通常说的自动注入、依赖注入。
  • 初始化:在一个对象的属性填充之后,Spring提供了初始化机制,程序员可以利用初始化机制来对Bean进行自定义加工,比如可以利用InitializingBean接口来对Bean中的其他属性进行赋值,或对Bean中的某些属性进行校验。
  • 初始化后:初始化后是Bean创建生命周期中最后一个步骤,我们常说的AOP机制,就是在这个步骤中通过BeanPostProcessor机制实现的,初始化之后得到的对象才是真正的Bean对象。
## 4. @Autowired

4.1 @Autowired是什么?

@Autowired表示某个属性是否需要进行依赖注入,可以写在属性和方法上。注解中的required属性默认为true,表示如果没有对象可以注入给属性则抛异常。

4.2 @Autowired加载在属性上时

@Service
public class OrderService{
    @Autowired
    private UserService userService;
}

当@Autowired加载某个属性上,Spring在进行Bean的生命周期过程中,在属性填充这一步,会基于实例化出来的对象,对该对象中加了@Autowired的属性自动给属性赋值。

Spring会先根据属性的类型去Spring容器中找出该类型所有的Bean对象,如果找出来多个,则再根据属性的名字从多个中再确定一个。如果required属性为true,并且根据属性信息找不到对象,则直接抛异常。

注意:完整的底层筛选逻辑步骤是更多的,不仅仅只有这两步。

4.2 @Autowired加载在方法上时

@Service
public class OrderService{
    @Autowired
    private UserService userService;
    
    @Autowired
    public void setUserService(UserService userService){
        this.userService = userservice;
    }
}

当@Autowired注解写在某个方法上时,Spring在Bean生命周期的属性填充阶段,会根据方法的参数类型、参数名字从Spring容器中找到对象当作方法入参,自动反射调用该方法。

4.3 @Autowired加在构造方法上时

@Service
public class OrderService{
    @Autowired
    private UserService userService;
    
    @Autowired
    public void OrderService(UserService userService){
        this.userService = userservice;
    }
    
    public OrderService(UserService userService, UserService userService1){
        this.userService = userService;
    }
}

当@Autowired加在构造方法上时,Spring会在推断构造方法阶段,选择该构造方法来进行实例化,在反射调用构造方法之前,会先根据构造方法参数类型、参数名从Spring容器中找到Bean对象,当作构造方法入参。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值