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

局网站建设制度app定制开发

局网站建设制度,app定制开发,网站后台怎么做的,沈阳天华建筑设计有限公司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/190934.html

相关文章:

  • 有什么做ppt参考的网站怎么把网站排名到百度前三名
  • 怎么给网站做优化百度店铺怎么入驻
  • 知名企业网站搭建品牌1688seo优化是什么
  • wordpress 标签修改seo标题优化关键词怎么选
  • WordPress网站接入公众号收录情况
  • 做网站用html还是phpseo是干啥的
  • 找能做网站的宁波seo推广如何收费
  • 建设赌博网站万网域名注册查询
  • 门户网站建设大概多少钱免费建站系统官网
  • 可以做国外购物的网站有哪些网店如何推广
  • 都有哪些做二手挖机的网站优秀网站设计欣赏
  • 长沙专门做网站公司有哪些十大搜索引擎地址
  • 手机网站开发存储数据北京网站快速优化排名
  • 临沂网站建设教程哪个搜索引擎能搜敏感内容
  • 城阳网站建设廊坊百度快照优化排名
  • 政府网站回复集镇建设规划石家庄最新新闻事件
  • 观澜做网站百度竞价推广费用
  • 学网站建设好不好肇庆网站制作软件
  • 高端手机网站设计百度账号人工客服电话
  • wordpress 100w 数据阳泉seo
  • dede二手车网站源码广州短视频代运营
  • 比较好的网站建设全媒体运营师培训机构
  • 网站建设 域名 服务器百度下载安装最新版
  • 给人做代工的网站百度推广代理公司
  • 泉州做网站价格百度竞价返点开户
  • app网站开发书籍下载太原百度seo
  • 做网站普洱百度如何快速收录网站
  • 做网站主页图片一般多少m免费域名注册服务网站
  • 中卫市住房和城乡建设局网站免费推广app软件下载
  • 网站 百度搜不到淘宝推广工具