BeanUtils.copyProperties(obj1,obj2)这个方法难道不是将obj2的值赋给obj1吗,而老师说最开始加载resource的时候属性值就会一一对应赋值,而Resource bean = new Resource()中的bean是new出来,应该没有值,按照老师代码中的顺序BeanUtils.copyProperties(resource,bean)这不是把bean的值赋给resource吗,那bean中依旧是没有值的哇?没明白这个问题。
这个我看视频的时候也想到了,然后测试了一下,直接让return resource;的话会出现错误的,不会正确显示的。你把它toString输出一下,可以看到自动装配后的resource是一个完整类名加后面一串类似这样的东西“$$EnhancerBySpringCGLIB$$9a1fe978@5eef9e0”,这说明它是spring给你生成的一个原来类的动态代理。这个动态代理是不能通过json显示出来的。
这个自己测试下就知道了。第一次通过资源文件映射的bean不是标准的Resource类的,带有其他的属性,这时候直接返回的话jackson无法转换,会报错。所以我们可以看到通过BeanUtils.copyProperties来获取标准的Resource类的bean,这时候就可以进行json转换了。
resource是交给Spring创建的单实例对象,在项目启动时Spring就会按照注解配置给该对象赋值。而new出来的bean对象,虽然与resource使用的同样的class对象,但却是不同的加载方式,不会有初始值。
你可能有些问题没想明白,我简单说下问题的关键。
首先,老师是创建了资源配置文件,并设置了几个属性值,如下图:
然后在Resource类中通过注解的方式为每个成员变量都读取设置了上面资源配置文件里的属性值,如下图:
这样简单来说,Resource类中定义的成员变量其实都是有值的,效果如下图:
认真对比上面两张图,应该明白了吧,在你new出Resource对象时,其实该对象的每个属性都是有值的。上面的我个人的浅显理解,可能叙述不太准确,目前,我也在积极学习中,正好看到你的问题,希望可以帮到你,。