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

依赖注入原理

参考文章: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 框架,构造方法注入的代码都是通用的
相关推荐
皮皮林5518 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
卡尔特斯12 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源12 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole12 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫12 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide13 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户37215742613513 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源13 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
Java中文社群14 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心14 小时前
从零开始学Flink:数据源
java·大数据·后端·flink