这节课里用构造函数注入MerchantsDao和直接注入的区别是什么?

来源:5-9 商户投放子系统 - 创建商户服务接口实现

邱虎666

2019-03-10

是不是用构造函数注入MerchantsDao的方式,在实例MerchantsServImpl类的时候直接传一个实例化好的merchants进去,而直接注入MerchantsDao的方式,在实例MerchantsServImpl的时候,这个Merchants还没有实例化,需要逐个参数set呢?谢谢老师。

写回答

1回答

张勤一

2019-03-10

同学你好:

    首先来说,不论是使用构造函数注入还是直接注入(直接在 bean 的上面标注 @Autowired 注解)的方式,都是在容易启动时,Spring 构造 bean 的时候主动完成的。从这个角度来说,这两种方式并没有很大的差别。但是,当我们直接注入的时候,idea 会给出这样的警告信息:

Field injection is not recommended.
Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies"

    这里的意思就是说:Spring 团队建议使用构造器注入,而不推荐其他的形式。这是因为,构造函数注入有如下的优点:

    1. 依赖不可变 components as immutable objects ,即注入对象为final

    2. 依赖不可为空required dependencies are not null,省去对注入参数的检查。当要实例化FooController的时候,由于只有带参数的构造函数,spring注入时需要传入所需的参数,所以有两种情况:1) 有该类型的参数传入 => ok; 2) 无该类型参数传入,报错

    3. 提升了代码的可复用性:非IOC容器环境可使用new实例化该类的对象。

    4. 避免循环依赖:如果使用构造器注入,在spring项目启动的时候,就会抛出:BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference?从而提醒你避免循环依赖,如果是field注入的话,启动的时候不会报错,在使用那个bean的时候才会报错。


    欢迎来 QQ 群随时交流、讨论,也非常感谢同学的支持! 

3
1
邱虎666
非常感谢!
2019-03-10
共1条回复

Java分布式后台开发 Spring Boot+Kafka+HBase

从零到一完整搭建企业级架构的通用卡包工程,让你迈到百度T4+ 。

886 学习 · 221 问题

查看课程