Spring

49 阅读1分钟

什么是Bean

简单来说,bean是一种可以重复使用的Java类,而想使用类中的属性和方法,需要将类实例化为对象。spring框架就是用IoC容器管理bean对象的创建、初始化、依赖注入等。

Bean的生命周期

spring bean中的生命周期指的是作用域为singleton的bean,对于作用域为prototype的bean,spring创建好实例后不再管理其生命周期。

目前暂时粗略的概括为 实例化 -> 属性赋值 -> 初始化 -> 销毁

doCreatBean中,createBeanInstance用于实例化,populateBean用于属性赋值,initializeBean用于初始化,销毁bean则是在spring容器关闭时调用ConfigurableApplicationContext.close()

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
        instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
    	// 实例化阶段
        instanceWrapper = this.createBeanInstance(beanName, mbd, args);
    }
    ...
    Object exposedObject = bean;
    try {
    	// 属性赋值阶段
        this.populateBean(beanName, mbd, instanceWrapper);
        // 初始化阶段
        exposedObject = this.initializeBean(beanName, exposedObject, mbd);
    } catch (Throwable var18) {
        ...
    }
    ...
}

@Value和@Autowire

@Valu给Java本身的类进行自动注入,是从properties文件中获取值,@Autowired给自己创建的类进行自动注入,是从Spring容器里获取。@Value还支持Spel(Spring Expression Language)表达式.

Bean的作用域(singleton和prototype)