理解IOC控制反转和spring容器,@Autowired的参数的作用

理解IOC控制反转,具体的应用场景,就是在学spring boot 的学生信息管理系统的时候,什么时候会用到注入,就是在service层 对studentservive 的接口的实现类上会用到调用repository的接口的实现类的实例化对象,这个部分是spring 的JPA自动给你完成的(动态代理),而这个对象是存在spring 这个容器里的

所以spring可以看成一个存放实例对象的容器

如何理解IOC 就是控制反转,也就是以前你来掌控着这个对象的创建,现在不用你创建了,你给这个控制的权力交给了spring

是不是只要用到接口,就得用 @Autowired?

基本可以这么理解,但有一个前提条件: 这个接口的实现类必须已经被 Spring **"托管"**了。

  • 前提条件 :你在 StudentServiceImpl 类上加了 @Service 注解。
  • 执行逻辑 :
    1. Spring 启动时,看到 @Service,于是把 StudentServiceImpl 实例化并放进"容器"里。
    2. Spring 扫描到 Controller 里的 @Autowired,它会去容器里找:"谁实现了 StudentService 这个接口?"
    3. 找到了!然后把那个实例"注入"到 studentService 变量中。

结论: 只要你想利用 Spring 容器里现成的对象(Bean),你就得用 @Autowired。如果你自己去 new StudentServiceImpl(),那这个对象就不受 Spring 管理了(比如它里面的 Repository 也会失效)。


完整的"层级调用链"

我们可以把这三层连起来看,你会发现每一层都在用 @Autowired 向上"借力":

  1. Repository 层:直接操作数据库。

  2. Service 层 :

    java 复制代码
    @Autowired
    private StudentRepository studentRepository; // 注入 Repository
  3. Controller 层 :

    java 复制代码
    @Autowired
    private StudentService studentService; // 注入 Service

为什么不直接在 Controller 里注入 Repository?

你可能会想:"既然 Repository 就能查数据库,为什么还要多此一举经过 Service 层呢?"

这是一个代码整洁度的问题:

  • 直接调用(偷懒法):Controller -> Repository。如果只是简单的查个表,确实没问题。
  • 标准调用(专业法) :Controller -> Service -> Repository。
    • 原因 :如果有一天,"删除学生"这个功能变得复杂了(比如:删除后要给家长发短信,还要更新班级人数),这些复杂的代码应该写在 Service 里。Controller 永远只需要喊一句 studentService.deleteById(id) 即可,它不需要知道背后发生了多少复杂的事情。

总结

@Autowired 就像是**"拼插积木"**的接口。

  • 你在 Service 上留个插口(@Service)。
  • 你在 Controller 上用磁铁吸住它(@Autowired)。
    这样,整个系统的各个零件就紧密地结合在一起了。

**这就是 Spring 的依赖注入(DI)。

相关推荐
Pniubi5 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko75 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师5 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.5 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼6 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说7 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐9 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu9 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO9 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析