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

依赖注入原理

参考文章: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 框架,构造方法注入的代码都是通用的
相关推荐
a程序小傲几秒前
国家电网Java面试被问:图数据库的查询优化和索引设计
java·数据库·面试
钱多多_qdd几秒前
springboot注解(三)
java·spring boot·后端
Seven971 分钟前
剑指offer-60、将⼆叉树打印成多⾏
java
一然明月1 分钟前
QT基本控件的使用
开发语言·qt
indexsunny2 分钟前
Java互联网大厂面试实战:Spring Boot、微服务与Kafka在电商场景中的应用
java·spring boot·微服务·kafka·消息队列·电商·数据库事务
hunter1990103 分钟前
spring线程池例子
java·后端·spring
秋95 分钟前
idea中使用AI编程助手通义灵码详解
java·intellij-idea·ai编程
渣渣苏7 分钟前
Java后端接入大模型API的坑
java·开发语言
胖咕噜的稞达鸭8 分钟前
库的原理和制作 动态库如何和可执行程序相关联,为什么程序入口点不是main函数,GOT表,PIC地址无关代码(2)
linux·c语言·开发语言·网络
番石榴AI8 分钟前
JiaJiaOCR:面向Java ocr的开源库
java·图像处理·人工智能·计算机视觉·开源·ocr