spring基础知识

2022/2/4 6:14:20

本文主要是介绍spring基础知识,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.什么是BeanDefinition?

表示bean定义,spring根据BeanDefinition来创建Bean对象。

重要属性:

beanClass:表示bean类型

scope:作用域,singleton表示单例,prototype表示原型(单例是一直用这个对象,原型表示对一个对象进行复制)

isLazy:原型bean懒加载不会起作用

dependsOn:创建一个bean之前所依赖的其他bean

primary:表示一个主bean,当需要按类型注入时,会有多个bean,如果存在主bean,会将主bean进行注入

initMethodName:初始化方法

@Component、@Bean、<bean/>都会被解析为BeanDefinition

 

2.什么是BeanFactory?

是一种“Spring容器”,翻译过来就是Bean工厂,顾名思义,他可以用来创建bean、获取bean。

 

3.BeanDefinition、BeanFactory、Bean三者的关系?

BeanFactory利用BeanDefinition定义来生成Bean对象。

 

4.BeanFactory的核心子接口和实现类?

ListableBeanFactory:

ConfigurableBeanFactory:

AutowireCapableBeanFactory:

AbstractBeanFactory:

DefaultListableBeanFactory:最重要,支持单例Bean、支持Bean别名、支持父子BeanFactory、支持Bean类型装换、支持Bean后置处理、支持FactoryBean、支持自动装配等等。

 

5.什么是Bean生命周期?

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

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

A、BeanDefinition:进行Bean定义

B、构造方法:推断选出一个构造方法

C、实例化:构造方法反射得到对象

D、属性填充:给属性进行自动填充(反射得到的对象属性还是不完整的,通过自动注入、依赖注入来注入属性)

E、初始化:对其他属性赋值、校验(利用初始化机制对Bean进行自定义加工,比如可以利用InitializingBean接口来对Bean中的其他属性进行赋值或者校验)

F、初始化后AOP、生成代理对象。

 

6.@Autowired注入过程:

spring会先根据属性的类型去spring容器中找出该类型的所有bean对象,如果找出来多个,则再根据属性的名字从多个中在确定一个,如果required属性为true,找不到注入对象则抛异常。

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

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

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

@Service
public class OrderService{

   @Autowired
   public OrderService(UserService userService){
      this.userService = userService 
  }  

}

 

7.@Resource是什么?

  @Resource注解与@Autowried类似,也是用来进行依赖注入的。@Resoruce是java层面所提供的注解,@Autowried是Spring所提供的注解,他们依赖注入的底层实现逻辑也不同。

  @Resource如果name属性有值,那么Spring会直接根据所指定的name值去Spring容器中找bean对象,如果找到了则成功,如果没有找到,则报错。

  如果@Resoruce的name属性没有值,首先1、先判断该属性名字在spring容器中是否存在bean。2.如果存在,则成功找到bean对象注入。3、如果不存在,则根据属性类型去spring容器中找bean对象。

 

8.@Value是什么?

@Value注解和@Resource、@Autowired类型,也是用来对属性进行依赖注入的,只不过@Value是用来从Properties文件中来获取值的,并且@Value可以解析SpEL

${}配置文件、#{}内容值充当beanName去spring容器中找bean,找到注入,没有报错

 

9.BeanFactory与FactoryBean的区别:BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。

 

 

 

10.ApplicationContext是什么?

ApplicationContext是比BeanFactory更加强大的Spring容器,它既可以创建Bean、获取Bean,还可以支持国际化、事件广播、获取资源等BeanFactory不具备的功能。



这篇关于spring基础知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程