1、问题一
1)、
● 在写属性配置文件的时候(即xxxPeoperties.java),只需要在该类上面添加@ConfigurationProperties(prefix = "...")即可,
此时不要把该类加入到容器中【即不要添加@Configuration注解或者@EnableConfigurationProperties(xxxProperties.class)】
● 在写配置类的时候,再在配置类上添加@EnableConfigurationProperties(xxxProperties.class)注解,
表明开启@ConfigurationProperties的功能,把属性配置文件中的属性和配置文件中的属性绑定,并把属性配置文件加入到容器中;
此外还需要添加@Configuration注解,说明这是一个配置类,相当于配置文件,可以向容器中添加组件。
2)、原因如下:
● 如果按照上面那么写,则容器启动的时候就不会把属性配置文件这个类添加到容器中,而是再使用的时候才会进行添加,相当于饿汉式和懒汉式
2、问题二
1)、在Spring3.x刚推出的时候,推荐使用注入的就是setter方式注入,官方给的解释就是,当属性是可选的时候,大量的构造函数参数会显得太笨拙,
还有一点就是setter的方式能用让类在之后重新配置或者重新注入。
2)、在Spring4.x的时候,Spring的官方文档中建议最好使用构造器注入,原因是:
①、保证依赖不可变(final关键字)
②、避免了循环依赖,让问题提前暴露
③、保证依赖不为空(省去了我们对其检查):当要实例化FooController的时候,由于自己实现了有参数的构造函数,所以不会调用默认构造函数,
那么就需要Spring容器传入所需要的参数,所以就两种情况:1、有该类型的参数->传入,OK 。2:无该类型的参数->报错。所以保证不会
为空,Spring总不至于传一个null进去吧
④、保证返回客户端(调用)的代码的时候是完全初始化的状态:这个可以跟上面的依赖不为空结合起来,向构造器传参之前,要确保注入的内容
不为空,那么肯定要调用依赖组件的构造方法完成实例化。而在Java类加载实例化的过程中,构造方法是最后一步(之前如果有父类先初始化
父类,然后自己的成员变量,最后才是构造方法,这里不详细展开。)。所以返回来的都是初始化之后的状态。
3)、构造器注入的时候,如果有多个构造器,则会报错Variable 'helloService' might not have been initialized
网友评论