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

相关推荐
狼爷15 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
祎雪双十Gy19 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java123419 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java
考虑考虑1 天前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫1 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev1 天前
广播接收器 → Flow + Lifecycle
android·java·kotlin
plainGeekDev1 天前
EventBus → SharedFlow
android·java·kotlin
带刺的坐椅1 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
用户3721574261351 天前
Java 将一个 PPT 文档拆分为多个文件
java
人活一口气2 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc