构造函数方式注入和普通注入有什么区别?
来源:5-9 商户投放子系统 - 创建商户服务接口实现

qq_张黎明_2
2019-10-23
1.构造函数方式注入数据库dao接口和普通注入有什么区别?
2.merchantsDao.save(request.toMerchants()) 这里是将merchants对象存入mysql数据库中么?如果不是merchants对象如何存入数据库中的?
1回答
-
张勤一
2019-10-23
同学你好:
首先,第一个问题: 我暂且把你这里说的两种注入方式叫做第一种(普通注入)和第二种(构造函数注入)。
对于第一种注入方式,你写完之后,会发现编辑器会给出类似下面的警告信息:
Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies
这里翻译过来的意思是:Spring 建议总是在您的 Bean 中使用构造函数建立依赖注入。总是使用断言强制依赖。(也就是你看到的第二种注入方式)
那么,通过构造函数注入(第二种),有什么好处呢?再来看看 Spring 的文档:
The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.
翻译过来的意思是:这个构造器注入的方式,能够保证注入的组件不可变,并且确保需要的依赖不为空。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态。
解释如下:
1. 依赖不可变:其实说的就是final关键字,Java 的语法。
2. 依赖不为空(省去了我们对其检查):由于自己实现了有参数的构造函数,所以不会调用默认构造函数,那么就需要 Spring 容器传入所需要的参数,所以就两种情况:1、有该类型的参数->传入;2:无该类型的参数->报错。所以保证不会为空。
3. 完全初始化的状态:这个可以跟上面的依赖不为空结合起来,向构造器传参之前,要确保注入的内容不为空,那么肯定要调用依赖组件的构造方法完成实例化。而在Java类加载实例化的过程中,构造方法是最后一步(之前如果有父类先初始化父类,然后自己的成员变量,最后才是构造方法。)。所以返回来的都是初始化之后的状态。
对于第二个问题,是将 merchants 对象保存到 MySQL 中。对于这里的用法,可以看看 JPA 的使用方法。
欢迎来 QQ 群随时交流、讨论,也非常感谢同学的支持!
20
相似问题