spring 之 depends-check
我们知道 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
spring 之 depends-check的更多相关文章
- Initialization failed for 'https://start.spring.io' Please check URL
错误描述:Initialization failed for 'https://start.spring.io' Please check URL, network and proxy setting ...
- Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings.
今天新建一个spring web项目,发现报错了.问题如下. 排除了网络问题,找到了解决办法.打开设置,点击check connection 输入 https://start.spring.io 点击 ...
- 成功解决Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings
文章目录 1.问题描述 2.问题的解决方式 2.1 查看网络连接问题 2.2 设置代理 2.3 直接连接阿里云下载模板 1.问题描述 建立springboot项目的时候发现不能初始化成功,我真的栓Q ...
- spring security 学习文档
web service Prepared by: Sea ...
- Spring Boot Reference Guide
Spring Boot Reference Guide Authors Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, ...
- 玩转spring boot——properties配置
前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...
- Spring Boot属性文件配置文档(全部)
This sample file is meant as a guide only. Do not copy/paste the entire content into your applicatio ...
- spring boot 全局配置属性一览
# =================================================================== # COMMON SPRING BOOT PROPERTIE ...
- Spring boot 全局配置文件application.properties
#更改Tomcat端口号 server.port=8090 #修改进入DispatcherServlet的规则为:*.htmlserver.servlet-path=*.html#这里要注意高版本的s ...
- Spring Boot配置大全
Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到 ...
随机推荐
- Java Base64编码
使用commons-codec, 下载地址 http://commons.apache.org/proper/commons-codec/ 下载commons-codec-1.12-bin.zip,解 ...
- XBOX360
[汇总+分享]XBOX360多人游戏汇总贴https://tieba.baidu.com/p/3550398060?pn=13&red_tag=3423139816&traceid= ...
- 黄聪:PHP发送邮件出现Connection: opening to ssl://的解决办法
PHP.ini文件开启下面2个功能: extension=php_sockets.dll extension=php_openssl.dll
- 黄聪:wordpress如何携带cookie模拟浏览器访问网站
$args = array( 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, li ...
- LeetCode——7. Reverse Integer
一.题目链接:https://leetcode.com/problems/reverse-integer/ 二.题目大意: 给定一个整数,要求反转该整数之后再返回:如果归返回的整数超过了int型整数的 ...
- spring4.0之三:@RestController
spring4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解.4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个 ...
- Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖
ylbtech-Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖 1.返回顶部 1. Java 实例 - 方法覆盖 Java 实例 前面章节中我们已经学习了 Jav ...
- 跨域的案例 以百度接口/手写接口为例,还有jQuery写法
仅在js部分输入即可 百度接口的案例 <script> function fn(data){ console.log(data) } </script> <script ...
- 关于微信小程序如何解决多层循环嵌套
http://www.jianshu.com/p/87cdf985b2b9 附加:小程序里面一些功能示例 http://blog.csdn.net/column/details/13721.html
- Android知识点textview加横线的属性
textView.getPaint().setFlags(Paint. UNDERLINE_TEXT_FLAG ); //下划线 textView.getPaint().setAntiAlias(tr ...