ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring中的注入方式

2022-01-01 14:59:15  阅读:159  来源: 互联网

标签:方式 Spring IUserService userService import public 注入


Spring中的注入方式

Spring中有几种注入方式

  • 字段注入
  • 构造注入
  • setter方法注入

字段注入

字段注入是平时开发中最常使用的注入方式,因为简单方便,可读性强。但是Spring官方不建议我们使用这种注入方式,在IDEA中使用字段注入时会给出黄牌警告。如下代码所示:

package com.wxw.controller;

import com.wxw.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {

    @Autowired
    private IUserService userService;

    public void queryUser(String name){
        userService.queryUser(name);
    }

}

在这里插入图片描述

字段注入会存在哪些问题

  1. 注入的字段对外部不可见:类中的字段访问修饰符都是private,如果不添加get/set方法,对外是不可见的。这时该字段只能由Spring进行操作,我们是访问不了的,与容器的耦合度太高,而且不符合Java开发规范。
  2. 无法注入不可变的对象:字段注入的时机是在对象创建之后进行的,如果注入的字段是final,则无法进行注入。

构造注入

构造注入是Spring官方推荐使用的注入方式,但平时开发中很少使用这种方式。构造注入可以解决字段注入对外部不可见、无法注入不可变对象的问题,但是构造注入也有缺点。
代码参考如下:

package com.wxw.controller;

import com.wxw.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {

    private final IUserService userService;

    @Autowired
    public UserController(IUserService userService) {
        this.userService = userService;
    }

    public void queryUser(String name){
        userService.queryUser(name);
    }

}

构造注入会存在哪些问题

  1. 如果注入的对象较多,那么构造函数就会变得臃肿,可读性较差。
  2. 构造注入无法解决循环依赖的问题,因为解决循环依赖需要用到三级缓存,对象放入三级缓存是在创建对象之后进行的,所以构造注入无法利用三级缓存解决循环依赖的问题。

setter方法注入

setter方法注入综合了字段注入与构造注入的优缺点,既不会像构造函数注入那样臃肿,也不会像字段注入那样不符合JavaBean规范。它可以解决循环依赖的问题,但是也不能注入不可变的对象。
代码如下:

package com.wxw.controller;

import com.wxw.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {

    private IUserService userService;

    @Autowired
    public void setUserService(IUserService userService) {
        this.userService = userService;
    }

    public void queryUser(String name){
        userService.queryUser(name);
    }

}

总结

  • 构造注入适合注入依赖性较强、不可变的对象;
  • setter注入适合可选对象的注入,可以解决循环依赖的问题;
  • 字段注入官方不推荐,因为注入的对象与Spring耦合较高,无法脱离Spring容器而创建。

标签:方式,Spring,IUserService,userService,import,public,注入
来源: https://blog.csdn.net/it_wxw/article/details/122267351

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有