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

相关推荐
小坏讲微服务1 小时前
SpringBoot4.0整合Spring Security+MyBatis Plus完整权限框架实现
java·spring·mybatis·spring security·mybatis plus·springboot4.0
jiayong232 小时前
第 43 课:任务详情抽屉里的批量处理闭环与删除联动
java·开发语言·前端
likerhood2 小时前
Java 访问修饰符:public、protected、private讲解
java·开发语言·javascript
Ting-yu2 小时前
SpringCloud快速入门(5)---- 均衡负载
java·spring·spring cloud
学不思则罔3 小时前
ParallelStream并发陷阱解析
java·开发语言·windows
认真的小羽❅3 小时前
【Java并发编程】volatile关键字深度解析:从内存语义到实际应用
java·开发语言
奋斗的小乌龟3 小时前
langchain4j笔记-08
java·spring boot·笔记
leonidZhao3 小时前
Java25新特性:加密对象的PEM编码
java