常见面试题-依赖注入原理

依赖注入原理

参考文章:https://www.51cto.com/article/716969.html

Spring 中的依赖注入是通过反射来实现的,当 IOC 容器创建 Bean 的时候,会检查 Bean 中定义的依赖关系,并且尝试通过反射来注入这些依赖关系

Spring 的依赖注入有三种方式:

  • 属性注入

    java 复制代码
    @RestController
    public class UserController {
        // 属性对象
        @Autowired
        private UserService userService;
    
        @RequestMapping("/add")
        public UserInfo add(String username, String password) {
            return userService.add(username, password);
        }
    }

    优点:

    • 使用简单,添加 @Autowired 即可

    缺点:

    • 无法注入一个不可变对象(final 修饰),因为 Java 中的 final 对象,要么初始直接赋值,要么在构造方法中赋值,如果使用属性注入 final 对象,不符合 Java 的 final 使用规范

      java 复制代码
      @Autowired
      private final UserService userService;
    • 与 IOC 容器耦合度过高,只能适用于 IOC 容器,其他非 IOC 框架不一定支持属性注入

    • 可能违背单一职责原则,通过属性注入比较简单,可能造成滥用,在一个类中引入多个属性依赖,引入的越多则承担了越多的责任,违背单一职责原则的可能性越大

  • Setter 注入

    java 复制代码
    @RestController
    public class UserController {
        // Setter 注入
        private UserService userService;
    
        @Autowired
        public void setUserService(UserService userService) {
            this.userService = userService;
        }
    
        @RequestMapping("/add")
        public UserInfo add(String username, String password) {
            return userService.add(username, password);
        }
    }

    优点:

    • setter 注入只针对一个对象,符合单一职责原则

    缺点:

    • 不能注入不可变对象(final 修饰的对象)
    • 注入的对象可被修改(在注入之后,如果在其他地方调用 setXX 会改变注入的对象)
  • 构造方法注入

    Spring 4.x 之后推荐的注入方式

    如果只有一个构造方法,可以不用在构造方法上添加 @Autowired,如下边代码,可以去掉 @Autowired 注解:

    java 复制代码
    @RestController
    public class UserController {
        // 构造方法注入
        private UserService userService;
    
        @Autowired
        public UserController(UserService userService) {
            this.userService = userService;
        }
    
        @RequestMapping("/add")
        public UserInfo add(String username, String password) {
            return userService.add(username, password);
        }
    }

    优点:

    • 可以注入不可变对象
    • 注入对象不会被修改
    • 通用性更好,无论是 IOC 框架还是非 IOC 框架,构造方法注入的代码都是通用的
相关推荐
奋斗的小花生4 分钟前
c++ 多态性
开发语言·c++
魔道不误砍柴功6 分钟前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2346 分钟前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨9 分钟前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程37 分钟前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*2 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue2 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man2 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉