当前位置: 首页 > wzjs >正文

局网站建设制度北京网络营销公司哪家好

局网站建设制度,北京网络营销公司哪家好,简单的模板网站,装修设计网站排行榜前十名7、Spring之Bean生命周期~初始化 初始化invokeAwareMethods()方法applyBeanPostProcessorsBeforeInitialization()方法invokeInitMethods()方法applyBeanPostProcessorsAfterInitialization()方法 初始化 spring初始化分为三步:初始化前、初始化和初始化后&#xff…

7、Spring之Bean生命周期~初始化

  • 初始化
    • invokeAwareMethods()方法
    • applyBeanPostProcessorsBeforeInitialization()方法
    • invokeInitMethods()方法
    • applyBeanPostProcessorsAfterInitialization()方法

初始化

  spring初始化分为三步:初始化前、初始化和初始化后,每一步作用也不相同,废话不多说,上代码:

/*** Initialize the given bean instance, applying factory callbacks* as well as init methods and bean post processors.* <p>Called from {@link #createBean} for traditionally defined beans,* and from {@link #initializeBean} for existing bean instances.** @param beanName the bean name in the factory (for debugging purposes)* @param bean     the new bean instance we may need to initialize* @param mbd      the bean definition that the bean was created with*                 (can also be {@code null}, if given an existing bean instance)* @return the initialized bean instance (potentially wrapped)* @see BeanNameAware* @see BeanClassLoaderAware* @see BeanFactoryAware* @see #applyBeanPostProcessorsBeforeInitialization* @see #invokeInitMethods* @see #applyBeanPostProcessorsAfterInitialization*/
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());} else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;// 初始化前if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}// 初始化try {invokeInitMethods(beanName, wrappedBean, mbd);} catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}// 初始化后 AOPif (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;
}

  通过上述代码,我们可以看到:

  1. 初始化方法的第一步会先调用invokeAwareMethods()方法进行Aware回调;
  2. 调用applyBeanPostProcessorsBeforeInitialization()方法完成初始化前操作;
  3. 调用invokeInitMethods()方法完成初始化操作;
  4. 调用applyBeanPostProcessorsAfterInitialization()方法完成初始化后操作;

invokeAwareMethods()方法

invokeAwareMethods()方法详解

private void invokeAwareMethods(String beanName, Object bean) {if (bean instanceof Aware) {// beanName回调if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}// BeanClassLoader回调if (bean instanceof BeanClassLoaderAware) {ClassLoader bcl = getBeanClassLoader();if (bcl != null) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);}}//BeanFactory回调if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}
}

  通过上述代码我们可以看到,这里会对BeanNameAware、BeanClassLoaderAware和BeanFactoryAware三个Aware接口进行回调操作;
  回调initializeBean()方法

applyBeanPostProcessorsBeforeInitialization()方法

applyBeanPostProcessorsBeforeInitialization()方法详解

	@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}

  这里我们可以看到,如果Bean有设置BeanPostProcessor接口的postProcessBeforeInitialization()方法在这里进行调用,Spring在这一步会判断bean对象有没有加@PostConstruct和@PreDestroy,如果有赋值给对应的属性,方便后续直接调用;
  回到initializeBean()方法

invokeInitMethods()方法

invokeInitMethods()方法详解

/*** Give a bean a chance to react now all its properties are set,* and a chance to know about its owning bean factory (this object).* This means checking whether the bean implements InitializingBean or defines* a custom init method, and invoking the necessary callback(s) if it does.** @param beanName the bean name in the factory (for debugging purposes)* @param bean     the new bean instance we may need to initialize* @param mbd      the merged bean definition that the bean was created with*                 (can also be {@code null}, if given an existing bean instance)* @throws Throwable if thrown by init methods or by the invocation process* @see #invokeCustomInitMethod*/
protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {if (logger.isTraceEnabled()) {logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");}if (System.getSecurityManager() != null) {try {AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {((InitializingBean) bean).afterPropertiesSet();return null;}, getAccessControlContext());} catch (PrivilegedActionException pae) {throw pae.getException();}} else {((InitializingBean) bean).afterPropertiesSet();}}if (mbd != null && bean.getClass() != NullBean.class) {String initMethodName = mbd.getInitMethodName();if (StringUtils.hasLength(initMethodName) &&!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {invokeCustomInitMethod(beanName, bean, mbd);}}
}

  这里可以看到,首先会判断当前Bean对象是否实现了InitializingBean接口,如果实现了就调用它的afterPropertiesSet()方法,然后判断BeanDefinition中是否指定初始化方法,如果指定啦初始化方法且不是afterPropertiesSet()方法的话,会调用BeanDefinition指定的初始化方法;
  回到initializeBean()方法

applyBeanPostProcessorsAfterInitialization()方法

applyBeanPostProcessorsAfterInitialization()方法详解

	@Overridepublic Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}

  如果Bean对象实现了BeanPostProcessor接口的postProcessAfterInitialization()方法进行初始化后设置,Spring中的AOP就是基于初始化后 实现的,初始化后返回的对象才是最终的Bean对象。
  回到initializeBean()方法

http://www.dtcms.com/wzjs/161082.html

相关文章:

  • 做网站推广销售怎么样郑州网站制作
  • 360游戏推广平台seo公司优化方案
  • 百度网站建设公司哪家好整站优化工具
  • 免备案空间什么意思澳门seo推广
  • 短视频动画制作seo最新快速排名
  • 嘉兴seo网站建设徐州关键词优化排名
  • 新疆生产建设兵团胡杨网站线上推广的优势和好处
  • axure 做网站电脑培训班一般要学多久
  • web标准网站有哪些优点网站推广搜索
  • 在线原型设计网站长沙网站优化
  • 网络建设上市公司排名百度有专做优化的没
  • wordpress tag__not_insem与seo
  • 音乐网站建设价格6新乡百度关键词优化外包
  • 做的网站在ie会乱码百度电商平台
  • python教程seo优化排名教程
  • 电子商务网站建设思维导图推广神器app
  • 北京专业制作网站公司吗360指数查询
  • 银川网站建设价格抖音关键词用户搜索排名靠前
  • 做衣服接订单的网站无锡网络推广平台
  • 开网站卖茶要怎么做上海百度公司地址在哪里
  • 郑州网站开发汉狮最新新闻播报
  • 网站备案流程核验单百度识图网页版在线使用
  • 如何自己做网站seo引擎搜索
  • 奉节做网站百度指数搜索热度
  • 六安服装网站建设地址纹绣培训班一般价格多少
  • 自己建服务器做网站违法重庆百度推广优化
  • 做化妆品销售网站如何百度关键词优化手段
  • 巨鹿建设银行网站首页百度直播
  • 国内 wordpress主题宁波seo网络推广优化价格
  • 不合理的网站域名查询seo