男女做那个网站动态图片,wordpress 网站上传,网站开发可选的方案有,wordpress 插件play文章目录Bean 的生命周期执行流程代码演示执行结果源码阅读AbstractAutowireCapableBeanFactorydoCreateBeaninitializeBeanBean 的生命周期
生命周期指的是一个对象从诞生到销毁的整个生命过程#xff0c;我们把这个过程就叫做一个对象的声明周期
Bean 的声明周期分为以下 …
文章目录Bean 的生命周期执行流程代码演示执行结果源码阅读AbstractAutowireCapableBeanFactorydoCreateBeaninitializeBeanBean 的生命周期
生命周期指的是一个对象从诞生到销毁的整个生命过程我们把这个过程就叫做一个对象的声明周期
Bean 的声明周期分为以下 5 个部分
实例化为 Bean 分配空间属性赋值Bean 注入和装配比如 Autowired初始化 执行各种通知如 BeanNameAwareBeanFactoryAwareApplicationContextAware 的接口方法执行初始化方法 xml 定义 init-method使用注解的方式 PostConstruct执行初始化后置方法BeanPostProcessor 使用 Bean销毁 Bean 销毁容器的各种方法如 PreDestoryDisposableBean 接口方法destory-method
执行流程 实例化和属性赋值对应构造方法和 setter 方法的注入。初始化和销毁是用户能自定义扩展的两个阶段可以在实例化之后类加载完成之前进行自定义“事件”处理 比如我们现在需要买一栋房子那么我们的流程是这样的 先买房实例化从无到有装修设置属性买家电如洗衣机冰箱电视空调等[各种]初始化可以注入入住使用 Bean卖房Bean 销毁 执行流程如下图所示
代码演示
Component
public class BeanLifeComponent implements BeanNameAware { private UserComponent userComponent; public BeanLifeComponent() { System.out.println(执行构造函数); } public void setUserComponent(UserComponent userComponent) { System.out.println(设置属性 userComponent); this.userComponent userComponent; } Override public void setBeanName(String s) { System.out.println(执行了 setBeanName 方法 s); } /** * 初始化 */ PostConstruct public void postConstruct() { System.out.println(执行 postConstruct()); } public void use() { System.out.println(执行了 use 方法); } /** * 销毁前执行方法 */ public void preDestroy() { System.out.println(执行preDestroy()); }
}执行结果 通过运行结果观察
先执行构造函数设置属性Bean 初始化使用 Bean销毁 Bean
源码阅读
以上步骤在源码中皆有体现
AbstractAutowireCapableBeanFactory
创建 Bean 的代码入口在 AbstractAutowireCapableBeanFactory#createBean
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {protected Object createBean(String beanName, RootBeanDefinition mbd,Nullable Object[] args) throws BeanCreationException {//...代码省略try {// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.// 在实例化之前是否有快捷创建的Bean也就是通过 PostProcessorsBeforeInstantiation返回的Bean// 如果存在则会替代原来正常通过target bean生成的bean的流程Object bean resolveBeforeInstantiation(beanName, mbdToUse);if (bean ! null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(),beanName,BeanPostProcessor before instantiation of bean failed, ex);}try {// 创建Bean// 方法中包含了实例化、属性赋值、初始化过程Object beanInstance doCreateBean(beanName, mbdToUse, args);if (logger.isTraceEnabled()) {logger.trace(Finished creating instance of bean beanName !);}return beanInstance;}//...代码省略}
}doCreateBean
点进去继续看源码doCreateBean#createBean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.if (instanceWrapper null) {// 1. 实例化阶段通过反射调用构造函数/工厂方法instanceWrapper createBeanInstance(beanName, mbd, args);}// Initialize the bean instance.Object exposedObject bean;try {// 2. 属性填充阶段依赖注入Autowired/Value等populateBean(beanName, mbd, instanceWrapper);// 3. 初始化阶段Aware接口回调、init-method、PostProcessor处理exposedObject initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// 4. 异常处理区分是否已标记为BeanCreationExceptionif (ex instanceof BeanCreationException beanName.equals(((BeanCreationException) ex).getBeanName())) {throw (BeanCreationException) ex;}else {throw new BeanCreationException(mbd.getResourceDescription(), beanName, Initialization of bean failed, ex);}}return exposedObject;
}这三个方法与三个生命周期阶段一一对应
createBeanInstance() -实例化populateBean() -属性赋值initializeBean() -初始化
initializeBean
继续点进去initializeBean
// 初始化 Bean
protected Object initializeBean(String beanName, Object bean, Nullable RootBeanDefinition mbd) { this.invokeAwareMethods(beanName, bean); Object wrappedBean bean; if (mbd null || !mbd.isSynthetic()) { wrappedBean this.applyBeanPostProcessorsBeforeInitialization(bean, beanName); } try { this.invokeInitMethods(beanName, wrappedBean, mbd); } catch (Throwable ex) { throw new BeanCreationException(mbd ! null ? mbd.getResourceDescription() : null, beanName, ex.getMessage(), ex); } if (mbd null || !mbd.isSynthetic()) { wrappedBean this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean;
}
// 调用的三个 Bean 开头的 Aware 方法
private void invokeAwareMethods(String beanName, Object bean) { if (bean instanceof Aware) { if (bean instanceof BeanNameAware) { BeanNameAware beanNameAware (BeanNameAware)bean; beanNameAware.setBeanName(beanName); } if (bean instanceof BeanClassLoaderAware) { BeanClassLoaderAware beanClassLoaderAware (BeanClassLoaderAware)bean; ClassLoader bcl this.getBeanClassLoader(); if (bcl ! null) { beanClassLoaderAware.setBeanClassLoader(bcl); } } if (bean instanceof BeanFactoryAware) { BeanFactoryAware beanFactoryAware (BeanFactoryAware)bean; beanFactoryAware.setBeanFactory(this); } } }