返回介绍

6.4.1 定制 BeanFactory

发布于 2025-04-22 22:09:12 字数 2340 浏览 0 评论 0 收藏 0

这里已经开始了对 BeanFactory 的扩展,在基本容器的基础上,增加了是否允许覆盖是否允许扩展的设置并提供了注解 @Qualifier 和 @Autowired 的支持。

protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {

 //如果属性 allowBeanDefinitionOverriding 不为空,设置给 beanFactory 对象相应属性,

 //此属性的含义:是否允许覆盖同名称的不同定义的对象

  if (this.allowBeanDefinitionOverriding != null) {

  beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);

 }

 //如果属性 allowCircularReferences 不为空,设置给 beanFactory 对象相应属性,

 //此属性的含义:是否允许 bean 之间存在循环依赖

  if (this.allowCircularReferences != null) {

  beanFactory.setAllowCircularReferences(this.allowCircularReferences);

 }

 //用于 @Qualifier 和 @Autowired

 beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowire

  Candidate Resolver());

}

对于允许覆盖和允许依赖的设置这里只是判断了是否为空,如果不为空要进行设置,但是并没有看到在哪里进行设置,究竟这个设置是在哪里进行设置的呢?还是那句话,使用子类覆盖方法,例如:

public class MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext{

  ... ...

  protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {

  super.setAllowBeanDefinitionOverriding(false);

  super.setAllowCircularReferences(false);

  super.customizeBeanFactory(beanFactory);

 }

}

设置完后相信大家已经对于这两个属性的使用有所了解,或者可以回到前面的章节进行再一次查看。对于定制 BeanFactory,Spring 还提供了另外一个重要的扩展,就是设置 Autowire CandidateResolver,在 bean 加载部分中讲解创建 Bean 时,如果采用 autowireByType 方式注入,那么默认会使用 Spring 提供的 SimpleAutowireCandidateResolver,而对于默认的实现并没有过多的逻辑处理。在这里,Spring 使用了 QualifierAnnotationAutowireCandidateResolver,设置了这个解析器后 Spring 就可以支持注解方式的注入了。

在讲解根据类型自定注入的时候,我们说过解析 autowire 类型时首先会调用方法:

Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);

因此我们知道,在 QualifierAnnotationAutowireCandidateResolver 中一定会提供了解析 Qualifier 与 Autowire 注解的方法。

QualifierAnnotationAutowireCandidateResolver.java

public Object getSuggestedValue(DependencyDescriptor descriptor) {

  Object value = findValue(descriptor.getAnnotations());

  if (value == null) {

   MethodParameter methodParam = descriptor.getMethodParameter();

   if (methodParam != null) {

    value = findValue(methodParam.getMethodAnnotations());

  }

 }

  return value;

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。