什么是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)表达式.