Spring IOC and DI

概述

介绍

1.Spring IOC是Spring核心思想之一

2.Spring是包含众多工具方法的IOC容器

容器:Spring里面装的是对象

IOC:控制反转,对象的控制在意料之外,相当于外包一同创建

Spring 、Spring MVC、Spring boot的关系

Spring 是那个功能齐备的大厨房,提供了所有底层能力。

Spring MVC 是厨房里那套"从接单到上菜"的规矩和动线,专门处理 Web 请求。

Spring Boot 是把厨房、服务员、出餐流程全打包好的快餐车或加盟店,让你省去搭建过程,开箱即用。

就像你现在想开餐馆(开发 Web 应用),Spring Boot 直接给你一辆餐车,厨房(Spring)和点餐屏幕(Spring MVC)都装好了,你只需点火炒菜就行。

三者之间不是互斥的

Spring IOC 和 DI

既然是一个容器,那么就需要具备:(1)存 (2)取,这两个功能.我们就通过注解来解决问题

IOC的注解

概述:将对象交给Spring进行统一管理进行存储,Spring的作用域:默认为单例模式

类注解:@Component,@Controller,@Configuration,@Service,@Repository

方法注解:@Bean

IOC详解

类注解

Q:我们如何知道交给Spring管理是生效的?

java 复制代码
@RestController
public class UserController {
    public String sayHello(){
        return "hello";
    }
}
java 复制代码
ApplicationContext context = SpringApplication.run(SpringIcoDemoApplication.class, args);
		UserController bean = context.getBean(UserController.class);
		System.out.println(bean);
		System.out.println(Introspector.decapitalize("UserController"));
		UserController bean1 =(UserController) context.getBean("userController");
		System.out.println(bean1);
		UserController bean2 = context.getBean("userController",UserController.class);
		System.out.println(bean2);
方法注解

Why什么使用方法注解:(1)当需要使用第三方提供的类时,想要Spring也对其进行管理,(2)Spring默认为单例模式,只能创建一个对象,但当同一个类,需要多个对象,就需要使用方法注解此时类注解

而且方法注解是开发人员自己创建对象,之后交给Spring进行管理

html 复制代码
@Configuration
public class BeanConfig {
    @Bean
    public UserInfo userInfo (){
        return new UserInfo("zhangsan",19);
    }
    @Bean
    public UserInfo userInfo2 (){
        return new UserInfo("lisi",25);
    }
}
bean name的命名规则
五大注解:

(1)如果类名前两个字母为大写,则bean name为类名本身

(2)其他情况:为类名的小驼峰

bean注解:

bean name为方法名

同时也可以给他们起别名

如果已经起了别名,还进行名字查询的话就会报错(DI)

DI的注解

DI详解

java 复制代码
@RestController
public class UserController {
    //属性注入
    @Autowired
    private UserService userService;
    public String sayHello(){
        userService.doService();
        System.out.println("do...controller");
        return "hello";
    }
}

IOC:new User Controller,但UserController依赖于UserService,DI:再创建UserController对象时,就把UserService进行赋值.也可以理解为创建UserController对象时,对其进行初始化

DI三种方式

属性注入
java 复制代码
@RestController
public class UserController {
    //属性注入
    @Autowired
    private UserService userService;
    public String sayHello(){
        userService.doService();
        System.out.println("do...controller");
        return "hello";
    }
}
构造方法注入
java 复制代码
 @Autowired
    public UserController(UserService userService, UserRepository repository) {
        System.out.println("执行Use Controller...构造方法");
        System.out.println("执行Use Repository...构造方法");
        this.userService = userService;
        this.repository = repository;
    }

当存在一个构造方法时,就默认执行这个构造方法

当存在多个但又有无参的构造方法时,就默认执行无参的构造方法

当存在多个且有多个有参没有无参,则报错

所以有多个构造方法时,有必要,指定默认执行哪一个构造方法

Set方法注入

set方法不想构造方法,必须调用才能够执行

java 复制代码
    //Set方法注入
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

@Autowired缺点

由于注入的时候是根据类型进行注入的,如果同一个类有多个对象,那么到底注入的是哪一个呢?

此时就需要有注解指定到底使用哪一个对象

@Primary(在类本身之上就是指定)

java 复制代码
@Configuration
public class BeanConfig {
    @Bean({"u1","ui1"})
    public UserInfo userInfo (){
        return new UserInfo("zhangsan",19);
    }
    @Bean
    //@Primary
    public UserInfo userInfo2 (){
        return new UserInfo("lisi",25);
    }
}

@Qualifier(依赖注入的时候指定,但需要输入名字)

java 复制代码
@Service
public class UserService {
    //@Autowired
    //@Qualifier("u1")
    @Resource(name = "userInfo2")
    private UserInfo userInfo;
    public void doService(){
        System.out.println(userInfo);
        System.out.println("do...service");
    }
}

@Resource(依赖注入的时候指定,但需要输入名字)

java 复制代码
@Service
public class UserService {
    @Resource(name = "userInfo2")
    private UserInfo userInfo;
    public void doService(){
        System.out.println(userInfo);
        System.out.println("do...service");
    }
}

@Resource = @Autowired + @Qualifier

相关推荐
文丑颜不良啊37 分钟前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang2 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪2 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息3 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼3 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff4 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff5 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
SL_staff6 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj5206 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发
桦说编程7 小时前
TransmittableThreadLocal 解读:从 CRR 机制到上下文所有权
java·后端·源码