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

外汇申报在哪个网站上做网络关键词排名软件

外汇申报在哪个网站上做,网络关键词排名软件,武汉建网站的网站,上海网站推广找哪家上一篇Spring源码二十一:Bean实例化流程四,咱们主要分析里createBeanInstance方法Spring给我们提供给的FactoryMethod方法,举例说明了factoryMethod属性如何使用,同时简单讨论了具体实现逻辑。 这一篇咱们将进入反射实例化Bean&am…

上一篇Spring源码二十一:Bean实例化流程四,咱们主要分析里createBeanInstance方法Spring给我们提供给的FactoryMethod方法,举例说明了factoryMethod属性如何使用,同时简单讨论了具体实现逻辑。

这一篇咱们将进入反射实例化Bean:


createBeanInstance构造推断

// 如果有多个构造方法,通过该方法查找对应的构造法方法Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {return autowireConstructor(beanName, mbd, ctors, args);}// Preferred constructors for default construction?// 获取首选的构造函数列表ctors = mbd.getPreferredConstructors();if (ctors != null) {return autowireConstructor(beanName, mbd, ctors, null);}// No special handling: simply use no-arg constructor.// 用无参构造函数来创建bean,先进入这个方法看下return instantiateBean(beanName, mbd);

 查找构造方法

determineConstructorsFromBeanPostProcessors 方法会调用BeanPostProcessor来查找与给定Bean类和Bean名称对应的构造函数。如果找到了一个或多个构造方法,或者满足以下任何一个条件:

如果满足其中任何一个条件,则调用 autowireConstructor 方法来通过构造函数自动装配来实例化Bean。

  • mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR:自动装配模式为构造函数自动装配。
  • mbd.hasConstructorArgumentValues():Bean定义中有构造函数参数值。
  • !ObjectUtils.isEmpty(args):构造函数参数不为空。

获取首选的构造函数

如果前面的条件不满足,代码会尝试获取首选的构造函数列表。如果存在首选的构造函数,也会调用 autowireConstructor 方法来实例化Bean。

使用无参构造函数

如果既没有找到构造方法,也没有指定构造函数参数,则使用无参构造函数来创建Bean。调用 instantiateBean 方法来实例化Bean对象。

instantiateBean

/*** 使用默认构造实例化一个bean* 首先使用instantiate方法实例化一个beanInstance* 然后构建一个BeanWrapper* 返回BeanWrapper对象** Instantiate the given bean using its default constructor.** @param beanName the name of the bean* @param mbd the bean definition for the bean* @return a BeanWrapper for the new instance*/protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {try {Object beanInstance;final BeanFactory parent = this;if (System.getSecurityManager() != null) {beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->getInstantiationStrategy().instantiate(mbd, beanName, parent),getAccessControlContext());}else {// 核心的方法是instantiatebeanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);}BeanWrapper bw = new BeanWrapperImpl(beanInstance);initBeanWrapper(bw);return bw;}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);}}
上述代码也是比较清晰的,咱们来简单分析一下:通过默认构造函数来实例化一个Bean,并将该Bean封装在一个 BeanWrapper 实例中。它首先检查系统是否启用了安全管理器,如果启用,则在特权模式下实例化Bean;否则,直接实例化。最后,它会对 BeanWrapper 进行初始化并返回。如果在此过程中出现任何异常,方法会捕获并抛出一个 BeanCreationException。

instantiate

通过上述分析,咱们接着进入instantiate方法看下。

public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {// Don't override the class with CGLIB if no overrides.//if (!bd.hasMethodOverrides()) {Constructor<?> constructorToUse;synchronized (bd.constructorArgumentLock) {constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;if (constructorToUse == null) {final Class<?> clazz = bd.getBeanClass();if (clazz.isInterface()) {throw new BeanInstantiationException(clazz, "Specified class is an interface");}try {if (System.getSecurityManager() != null) {constructorToUse = AccessController.doPrivileged((PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);}else {constructorToUse = clazz.getDeclaredConstructor();}bd.resolvedConstructorOrFactoryMethod = constructorToUse;}catch (Throwable ex) {throw new BeanInstantiationException(clazz, "No default constructor found", ex);}}}// 实例化beanreturn BeanUtils.instantiateClass(constructorToUse);}else {// Must generate CGLIB subclass.return instantiateWithMethodInjection(bd, beanName, owner);}}

上述代码:首先检查 bd 是否有方法重写,如果没有则采用直接实例化的方式。通过同步块确保构造函数解析的线程安全性,尝试获取默认构造函数。如果类是接口或没有默认构造函数,则抛出异常。成功获取构造函数后,通过 BeanUtils.instantiateClass 方法实例化 bean。如果有方法重写,则使用 CGLIB 动态生成子类进行实例化。

我们再进入BeanUtils.instantiateClass方法中看下:


BeanUtils.instantiateClass

{Assert.notNull(ctor, "Constructor must not be null");try {ReflectionUtils.makeAccessible(ctor);if (KotlinDetector.isKotlinReflectPresent() && KotlinDetector.isKotlinType(ctor.getDeclaringClass())) {return KotlinDelegate.instantiateClass(ctor, args);}else {Class<?>[] parameterTypes = ctor.getParameterTypes();Assert.isTrue(args.length <= parameterTypes.length, "Can't specify more arguments than constructor parameters");Object[] argsWithDefaultValues = new Object[args.length];for (int i = 0 ; i < args.length; i++) {if (args[i] == null) {Class<?> parameterType = parameterTypes[i];argsWithDefaultValues[i] = (parameterType.isPrimitive() ? DEFAULT_TYPE_VALUES.get(parameterType) : null);}else {argsWithDefaultValues[i] = args[i];}}// 通过反射来实例化一个bean实例return ctor.newInstance(argsWithDefaultValues);}}catch (InstantiationException ex) {throw new BeanInstantiationException(ctor, "Is it an abstract class?", ex);}catch (IllegalAccessException ex) {throw new BeanInstantiationException(ctor, "Is the constructor accessible?", ex);}catch (IllegalArgumentException ex) {throw new BeanInstantiationException(ctor, "Illegal arguments for constructor", ex);}catch (InvocationTargetException ex) {throw new BeanInstantiationException(ctor, "Constructor threw exception", ex.getTargetException());}}

上述代码可以看到:首先确保传入的构造函数不为 null,并通过 ReflectionUtils.makeAccessible 方法确保构造函数可访问。如果类是 Kotlin 类型,则通过 KotlinDelegate.instantiateClass 方法实例化,这块可以直接跳古偶。

否则,检查参数长度并为 null 参数赋默认值,然后调用构造函数创建实例。若实例化过程中出现异常,则抛出相应的 BeanInstantiationException 异常,提示可能的错误原因,如类是否为抽象类、构造函数是否可访问、参数是否合法或构造函数是否抛出异常。

小结 

今天咱们主要了解到bean在实例化之前会推测构造方法,然后根据构造方法的类型来通过反射机制来完成具体的实例化。到这里咱们终于看到了实例化的bean,接下来Spring会对这个刚刚实例化好的bean做些什么呢?

总结

http://www.khdw.cn/news/12279.html

相关文章:

  • 网站打开文件按钮怎么做外贸定制网站建设电话
  • 自己做b2b平台网站建设网站优化排名易下拉系统
  • 做外贸必须用的社交网站网络营销和网络销售的关系
  • 哪些公司做网站开发it培训机构有哪些
  • 注册博客域名做视频网站会怎么样株洲百度seo
  • 赤壁网站设计互联网行业都有哪些工作
  • 北京做网站便宜的公司哪家好软文代写公司
  • 保险平台官网seo公司seo教程
  • 外贸零售网站建设注册网站多少钱
  • 网站设计制作厂家有哪些对网站进行seo优化
  • 北京网站建立公司网站网络推广优化
  • 工作室做网站流程百度指数爬虫
  • 阳江市网络问政首页seo北京优化
  • 拍卖 网站 建设在seo优化中
  • 后缀的域名暂无法进行网站备案如何自己开发一个平台
  • 免费的logo网站营销策略的思路
  • 做网站需要什么学历百度图片搜索网页版
  • wordpress配置数据库失败长沙关键词优化推荐
  • 专业点的网站制作公司培训心得体会1000字通用
  • wordpress term_id哈尔滨seo关键词
  • 怎么自己做论坛网站吗百度收录量
  • html5网站检测互联网营销师报考条件
  • 做医疗的网站建设百度免费优化
  • 以下哪一项不属于seo对网站推广的作用网站制作多少钱
  • 北京燕郊网站建设黄页污水
  • node mysql做动态网站东莞推广服务
  • 阿里买域名 电脑做网站互联网关键词优化
  • 引流量的网站网络营销的功能有哪些?
  • 什么网站做美式软装设计理念seo优化托管
  • 淘宝上做网站排名百度快照优化排名推广