我们知道 spring xml 配置中 bean 的子元素 property 是按照 setXxx(SomeType someParam) 方式来设值的,换句话说, 是根据属性的setter 方法, 而不是根据 属性的名字。

有多少个 setter ,那么就可以进行多少次的 <property> 赋值。 但是,这里bean的property 赋值不是强制的。 就是说,可以在配置文件中通过property 子元素进行 初始化赋值, 也完全可以不对bean的属性进行初始化。

但是, spring 还是给我们提供了这么一个属性检查的配置选项, 这就是 dependency-check !

dependency-check 是一个已经被标注为 deprecated 的东东了,被spring3 取消了,但是到了spring4,貌似又恢复了。 究其原因,是它 用途不是很大了, 而且甚至会引起误会。 不过初学的时候,被它迷惑了很久。

dependency-check 有 4给候选值: none, simple,objects, all。

none 当然,就是说不进行检查。 这个也是默认值。

dependency-check="simple" 就说 只检查简单类型属性以及集合类型属性  
dependency-check="objects" 就说 检查除简单类型属性以及集合类型属性外的引用类型属性

当然, all 就是检查所有的 setter 。 所有的setter 方法对应的 属性, 必须在bean  的子元素property 中进行配置

 
INFO: Loading XML bean definitions from class path resource [beans.xml]
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'boss' defined in class path resource [beans.xml]: Unsatisfied dependency expressed through bean property 'office': Set this property value or disable dependency checking for this bean.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.checkDependencies(AbstractAutowireCapableBeanFactory.java:)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:)
at org.springframework.beans.factory.support.AbstractBeanFactory$.getObject(AbstractBeanFactory.java:)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:)
at AnnoIoCTest.main(AnnoIoCTest.java:)

从上面的异常堆栈, 我们可以看到 dependency-check 的处理逻辑, 源码是:

    protected void checkDependencies(String beanName, AbstractBeanDefinition mbd, PropertyDescriptor[] pds, PropertyValues pvs) throws UnsatisfiedDependencyException {
int dependencyCheck = mbd.getDependencyCheck();
PropertyDescriptor[] var6 = pds;
int var7 = pds.length; for(int var8 = ; var8 < var7; ++var8) {
PropertyDescriptor pd = var6[var8];
if(pd.getWriteMethod() != null && !pvs.contains(pd.getName())) {
boolean isSimple = BeanUtils.isSimpleProperty(pd.getPropertyType());
boolean unsatisfied = dependencyCheck == || isSimple && dependencyCheck == || !isSimple && dependencyCheck == ;
if(unsatisfied) {
throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, pd.getName(), "Set this property value or disable dependency checking for this bean.");
}
}
} }

从中, 我们可以看到  dependency-check 对 Autowired 是没有特殊处理的, 这就导致了一个问题: 如果我们的bean的属性通过 Autowired 注入 而没有通过 property 进行setter 设置,那么会 进入

 !isSimple && dependencyCheck == 1

返回true,然后就出现UnsatisfiedDependencyException异常。

参考:

http://blog.csdn.net/arvinrong/article/details/7763180

最新文章

  1. KVC 和 KVO
  2. code vs 1098 均分纸牌(贪心)
  3. 关于js的keycode13
  4. nodejs学习资料
  5. paper 84:机器学习算法--随机森林
  6. hdu1054(二分图匹配)
  7. 10 Interesting Linux Command Line Tricks and Tips Worth Knowing
  8. 【不积跬步,无以致千里】AMQP协议介绍
  9. css3学习笔记之文本效果
  10. 【转】基于jquery的无刷新表格分页
  11. PHP 计算页面执行时间
  12. iphone内容开发技术学习
  13. 【SSH三个框架】Hibernate第七基金会:不少下属业务
  14. Windows Server 2008 R2服务器系统安全设置参考指南
  15. HTML-Note
  16. sql 查询语句的练习2
  17. UINavigationController - BNR
  18. bzoj4240有趣的家庭菜园(贪心+逆序对)
  19. getaddrinfo函数
  20. ubuntu下签名命令

热门文章

  1. responsiveslides 插件(图片轮播插件)
  2. js-signals学习以及应用
  3. create-react-app快速搭建react-app
  4. 【linux】常用命令-端口
  5. Python如何查询Mysql
  6. 微服务之分布式跟踪系统(springboot+zipkin+mysql)
  7. jQuery的效果
  8. jenkins+git 构建项目
  9. 安卓权威编程指南 - 第五章学习笔记(两个Activity)
  10. [UE4]第一人称与第三人称