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

免费做初中试卷的网站长沙seo服务哪个公司好

免费做初中试卷的网站,长沙seo服务哪个公司好,门户网站开发建设技术,佛山广告设计公司排名前置知识 1 入口 DefaultListableBeanFactory#resolveDependency 2 每个依赖都有对应的DependencyDescriptor 3 自定绑定候选对象处理器AutowireCapableBeanFactory 注入处理 我们可以看到接口AutowireCapableBeanFactory中有两个方法。 第一个是单个注入: Null…

前置知识

1 入口 DefaultListableBeanFactory#resolveDependency
2 每个依赖都有对应的DependencyDescriptor
3 自定绑定候选对象处理器AutowireCapableBeanFactory

注入处理

我们可以看到接口AutowireCapableBeanFactory中有两个方法。
第一个是单个注入:

@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;

还有一个是Set集合注入:

@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;

我们可以看到它的实现关系:
在这里插入图片描述

下面这个代码从IOC中查找并注入一个Bean,依据这个区跟踪一下源码:

public class AnnotationDependencyInjectResolutionDemo {@Autowiredprivate Person person;public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(AnnotationDependencyInjectResolutionDemo.class);context.refresh();QualifierAnnotationDependencyInjectDemo bean = context.getBean(QualifierAnnotationDependencyInjectDemo.class);}}

我们直接断点看一下DefaultListableBeanFactory#resolveDependency
在这里插入图片描述

DependencyDescriptor参数里面的信息:
在这里插入图片描述
DependencyDescriptor 描述了我们要注入的目标的一些信息:
参考文章:https://blog.csdn.net/andy_zhang2007/article/details/88135669

// 保存所包装依赖(成员属性或者成员方法的某个参数)所在的声明类,
// 其实该信息在 field/methodParameter 中已经隐含
private final Class<?> declaringClass;
// 如果所包装依赖是成员方法的某个参数,则这里记录该成员方法的名称
@Nullable
private String methodName;
// 如果所包装的是成员方法的某个参数,则这里记录该参数的类型
@Nullable
private Class<?>[] parameterTypes;
// 如果所包装的是成员方法的某个参数,则这里记录该参数在该函数参数列表中的索引
private int parameterIndex;
//如果所包装的是成员属性,则这里记录该成员属性的名称
@Nullable
private String fieldName;
// 标识所包装依赖是否必要依赖
private final boolean required;
// 标识所包装依赖是否需要饥饿加载
private final boolean eager;
// 标识所包装依赖的嵌套级别
private int nestingLevel = 1;
// 标识所包装依赖的包含者类,通常和声明类是同一个
@Nullable
private Class<?> containingClass;
// 所包装依赖 ResolvableType 的缓存
@Nullable
private transient volatile ResolvableType resolvableType;
// 所包装依赖 TypeDescriptor 的缓存
@Nullable
private transient volatile TypeDescriptor typeDescriptor;

下面分类去跟踪注入过程。

依赖查处理过程

1 普通的字段

@Configuration
public class LookUpByAnnotationSingle {@AutowiredPersonHolder personHolder;@Single@BeanPersonHolder personHolder(){Person person = new Person();person.setId(777L);person.setName("yong");return new PersonHolder(person);}public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(LookUpByAnnotationSingle.class);context.refresh();Object bean = context.getBean("personHolder");context.close();}
}
  • 字段注入前面的判断都会跳过进入到下面这个方法
    在这里插入图片描述

  • 同样的我们只关注字段注入的核心流程,前面的条件都不满足来到这个方法findAutowireCandidates:

在这里插入图片描述

这个方法里面首先BeanFactoryUtils#beanNamesForTypeIncludingAncestors找到候选的Beans
在这里插入图片描述
候选的Bean是通过上面这个方法找到的,并且返回的时候将Bean对象放入到Map中。
在这里插入图片描述
然后我们如果我们多个bean,determineAutowireCandidate这个方法会决定一个Bean,决定的方式为如果使用了Primary就注入PrimaryBean否则Ordered根据这个接口定义(或者我们在Bean申明的时候标注了@Order注解)的优先级来寻找,数字越低优先级越高:
在这里插入图片描述
2 集合

@Autowired
private Collection<Person> personGroupAll;

集合注入核心逻辑会走到下面这个方法,这个方法返回的时候multipleBeans已经不为空了这个这个直接返回。
在这里插入图片描述
为什么上面可以直接返回呢,因为在resolveMultipleBeans方法中,判断了注入的类型如果是集合类型,也是走的一样的逻辑findAutowireCandidates找到候选的Bean进行返回。
在这里插入图片描述
3 懒加载

@Autowired
@Lazy
private Person person;

在懒注入的时候我们在这个方法已经有值了,所以逻辑在这一步就结束了,返回的是一个代理对象。
在这里插入图片描述
这个对象是cglib提升后的对象:
在这里插入图片描述

4 Optional

@Autowiredprivate Optional<Person> person;

核心逻辑是走下面

在这里插入图片描述
其实里面的逻辑是一样的,只是最后封装为Optional:
在这里插入图片描述

@Autowired注入过程

  • 元信息解析
  • 依赖查找
  • 依赖注入(字段方法)
    核心方法是AutowiredAnnotationBeanPostProcessor#AutowiredFieldElement#inject,在注入的过程中会先去处理依赖也就是上面的流程:
    参数bean是我们标注的类
    在这里插入图片描述

这个方法被谁调用呢?属性后置处理AutowiredAnnotationBeanPostProcessor#postProcessProperties,当我们用xml配置的时候那么这个时候PropertyValues存储的就是的配置值
在这里插入图片描述
从打断点来看postProcessProperties方法会先于set注入执行,也就是先注入元信息,然后再注入值。
下面这个方法是合并子类和父类的元信息,每个类都会进入这个方法如果没有父类就是自己的元信息,这个方法在postProcessProperties之前执行。
在这里插入图片描述
这里会去查找AutowiredAnnotationBeanPostProcessor#buildAutowiringMetadata
在这里插入图片描述

http://www.hkea.cn/news/6193/

相关文章:

  • 上海企业自助建站系统宁波seo外包代运营
  • wordpress单页面静态网页怎么优化
  • 武汉网站程序开发公司企业seo顾问
  • 怎么用centos做网站深圳seo排名
  • 客服网站制作建立一个企业网站需要多少钱
  • 深圳自建网站爱站工具包的模块
  • 大学生校园活动策划书荥阳seo推广
  • 做是么网站百度网站推广价格
  • balsamiq网站制作教程域名收录
  • wordpress 改网站介绍廊坊seo网络推广
  • 桐乡市住房建设局网站公示东营网站建设费用
  • 京东店铺转让网站seo源码
  • 如何做b2b网站推广免费的模板网站
  • 个人网站主页建设教程武汉最新疫情
  • 做网站建设哪家好最新seo教程
  • 淮北市网站制作公司百度推广创意范例
  • 建站abc网站建设掉发脱发严重是什么原因
  • 3e网站建设推广方案如何写
  • 磁县专业做网站成都网站seo排名优化
  • 深圳住房和建设局网站认租申请网站外包公司有哪些
  • 网站策划选题南阳seo优化
  • 朝阳做网站石家庄百度关键词搜索
  • 网上购物商城开题报告东莞百度推广优化
  • 咸阳网站建设报价百度浏览器
  • 安防网站下载百度大数据分析
  • 业务网站制作河南网站关键词优化
  • wordpress artx站内seo优化
  • 巴中微信开发 做网站最新的疫情最新消息
  • 种子搜索网站开发seo课程培训机构
  • java做的网站怎么设置关闭和开启网站访问不了网络营销的基本特征