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 分钟前
【Java项目-企悦抽】15-活动管理模块02-活动创建测试与活动列表实现
java·开发语言·springboot
斯内普吖38 分钟前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
wang_shu_mo_ran1 小时前
Spring IoC和DI概念篇
java·后端·spring
小狼154541 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript
Joe_Wang51 小时前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收
wuminyu1 小时前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
弹简特2 小时前
【Java项目-企悦抽】13-奖品管理模块-奖品列表和创建奖品的实现
java·开发语言·网络·springboot
小蒜学长2 小时前
基于Spring Boot+Vue的“禾源”农产品销售系统设计与实现(代码+数据库+LW)
java·spring boot·后端·农产品销售系统·产品溯源
光年20002 小时前
Mock-Server开箱即用的Mock服务
java·maven·mock·jetty
弹简特2 小时前
【Java项目-企悦抽】14-活动管理模块01-创建活动的实现
java·开发语言·springboot