Spring源码分析之组件扫描自动装配类

注册注解装配bean处理类,默认注解有Autowired,Value,Inject


if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
  RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
  def.setSource(source);
  beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}

public AutowiredAnnotationBeanPostProcessor() {
  this.autowiredAnnotationTypes.add(Autowired.class);
  this.autowiredAnnotationTypes.add(Value.class);
  try {
    this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
        ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
    logger.info("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
  }
  catch (ClassNotFoundException ex) {
    // JSR-330 API not available - simply skip.
  }
}

首先实现了接口SmartInstantiationAwareBeanPostProcessor,需要选择合适的构造器,解析方法上带的注解Lookup,组成方法覆盖属性


public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, final String beanName) throws BeansException {
  if (!this.lookupMethodsChecked.contains(beanName)) {
    ReflectionUtils.doWithMethods(beanClass, new ReflectionUtils.MethodCallback() {
      @Override
      public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
        Lookup lookup = method.getAnnotation(Lookup.class);
        if (lookup != null) {
          LookupOverride override = new LookupOverride(method, lookup.value());
          try {
            RootBeanDefinition mbd = (RootBeanDefinition) beanFactory.getMergedBeanDefinition(beanName);
            mbd.getMethodOverrides().addOverride(override);
          }
          catch (NoSuchBeanDefinitionException ex) {
            throw new BeanCreationException(beanName,
                "Cannot apply @Lookup to beans without corresponding bean definition");
          }
        }
      }
    });
    this.lookupMethodsChecked.add(beanName);
  }

  // Quick check on the concurrent map first, with minimal locking.
  Constructor<?>[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);
  if (candidateConstructors == null) {
    synchronized (this.candidateConstructorsCache) {
      candidateConstructors = this.candidateConstructorsCache.get(beanClass);
      if (candidateConstructors == null) {
        Constructor<?>[] rawCandidates = beanClass.getDeclaredConstructors();
        List<Constructor<?>> candidates = new ArrayList<Constructor<?>>(rawCandidates.length);
        Constructor<?> requiredConstructor = null;
        Constructor<?> defaultConstruc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值