- 前言
- 第一部分 核心实现
- 第 1 章 Spring 整体架构和环境搭建
- 第 2 章 容器的基本实现
- 第 3 章 默认标签的解析
- 第 4 章 自定义标签的解析
- 第 5 章 bean 的加载
- 第 6 章 容器的功能扩展
- 第 7 章 AOP
- 第二部分 企业应用
- 第 8 章 数据库连接 JDBC
- 第 9 章 整合 MyBatis
- 第 10 章 事务
- 第 11 章 SpringMVC
- 第 12 章 远程服务
- 第 13 章 Spring 消息
6.4.1 定制 BeanFactory
这里已经开始了对 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论