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

相关推荐
码界索隆14 小时前
Python转Java系列:前言
java·开发语言·python
蓦然回首却已人去楼空14 小时前
【分词:中文分词】BPE字节级分词算法实现汉字表达!
java·算法·中文分词
asdfg125896314 小时前
一文理解Java中的泛型
java·开发语言
飞翔中文网14 小时前
Java学习笔记之反射
java·笔记·学习
河阿里14 小时前
Spring Boot:整合Quartz集群部署指南
java·spring boot·后端
小肥君14 小时前
gpu安装milvus问题解决
java·eureka·milvus
砍材农夫14 小时前
物联网实战:Spring Boot MQTT | 模拟器Paho客户端拆解高性能
java·javascript·spring boot·后端·物联网·struts
电商API_1800790524715 小时前
免 TOP 入驻,第三方淘宝商品详情 API 快速接入与代码示例
java·大数据·开发语言·数据库·爬虫·数据分析
IT空门:门主15 小时前
Java AI 开发框架终极对比:Spring AI vs Spring AI Alibaba vs AgentScope-Java
java·人工智能·spring·spring ai·ai alibaba·agentscope-java
未若君雅裁15 小时前
多线程项目场景:CountDownLatch、Future、Semaphore
java