spring构造器注入

写法:


spring构造器注入_第1张图片


咱们先看官网文档是怎么的:

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. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns.Setter injection should primarily only be used for optional dependencies that can be assigned reasonable default values within the class. Otherwise, not-null checks must be performed everywhere the code uses the dependency. One benefit of setter injection is that setter methods make objects of that class amenable to reconfiguration or re-injection later. 

我们把他翻译出来就是:

Spring团队通常提倡构造函数注入,因为它允许将应用程序组件实现为不可变对象,并确保所需的依赖项不是null。此外,构造函数注入的组件总是以完全初始化的状态返回给客户端(调用)代码。作为补充说明,大量的构造函数参数是一种糟糕的代码味道,这意味着类可能有太多的职责,应该重构它们,以便更好地处理关注点的适当分离。Setter注入应该主要用于可选依赖项,这些依赖项可以在类中分配合理的默认值。否则,必须在代码使用依赖项的任何地方执行非空检查。setter注入的一个好处是,setter方法使该类的对象可以在以后重新配置或重新注入。


依赖不可变:其实说的就是final关键字,写法就是(private final Service service;)

依赖不为空:当实例化Controller的时候,由于自己实现了有参数的构造函数,所以不会调用默认构造函数,那么就需要Spring容器传入所需要的参数。

spring构造器注入_第2张图片
依赖不为空

完全初始化的状态:我的理解向构造器传参之前,要确保注入的内容不为空,通过调用依赖组件的构造方法完成实例化。(Java类加载实例化过程:父类-->自己的成员变量-->构造方法)。所以返回来的都是初始化之后的状态。


通过查询各种资料和发现使用构造函数注入的优点和缺点如下:

优点:

    依赖不可变(加了final关键字)

    依赖不为空(省去了检查)

    完全初始化的状态

    避免了循环依赖

    提升了代码的可复用性

缺点:

    构造函数会有很多参数。

    有些类是需要默认构造函数的,一旦使用构造函数注入,就无法使用默认构造函数。

    这个类里面的有些方法并不需要用到这些依赖。


最后给大家提供IntelliJ IDEA @Autowired 快速切换成构造注入的快捷键:

按Alt+Enter(回车键)

spring构造器注入_第3张图片

选择自己需要的按回车键ok。

你可能感兴趣的:(spring构造器注入)