在Spring配置当中,对象的依赖可以通过显示的
那么问题来了:如果一个依赖进行了
配置内容:
对象:
public class Chinese {
private Zhejiang zhejiang;
//get set ...
}
通过容器获取chinese对象输出他的zhejiang属性。获取zhejiang对象并输出得到:
myspring.Zhejiang@41e36e46
myspring.Zhejiang@15c43bd9
问题一的答案:两个不同的对象,说明最终以property配置为准。
疑问二:是先进行了自动装配而后由property配置进行的覆盖,还是先由property注入而后由自动装配的程序判断依赖未进行property申明再进行注入?
假设先自动装配,而后进行property配置进行覆盖,那么如下配置可正常执行:
按照假设,通过类型将zhejiang对象注入chinese的依赖中,然后进行的组合属性“zhejiang.name=浙江人”的设置可正常进行。
运行结果是:Invalid property 'zhejiang' of bean class [myspring.Chinese]: Value of nested property 'zhejiang' is null 空指针错误。
【问题二的答案】说明Spring的执行过程应该是先property配置,然后再进行autowire的注入。当进行autowire匹配注入的时候,先判断该依赖(属性)是否已由property申明,未申明再将对象引用赋值给它。
按照这个测试,配置文件显式的配置优于自动装配,且先进行显式配置后进行自动装配。
此处又做了一个测试,当Chinese创建时,就实例化一个Zhejiang赋值给zhejiang属性。再由Spring配置文件进行依赖注入。这里主要是为了判别,以上的自动装配是因为由property申明了而不再进行注入,还是因为property使得依赖非空而不进行注入(我最初猜测自动装配是判断依赖为空才进行的注入。)
配置内容:
执行:
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
Chinese person = ctx.getBean("chinese", Chinese.class);
System.out.println(person.getZhejiang());
结果:
myspring.Zhejiang@4b6995df
myspring.Zhejiang@2c9f9fb0
结果表明:
即使引用存在对象,依然会进行依赖注入。以上的自动装配之所以未执行,是因为进行了property的申明,而未进行装配注入。自动装配不是依据其依赖是否为空做判断。
当然,查看其源代码则更清楚其实际的逻辑。