一. IoC & DI 入门
IoC
IoC是Spring的核心思想
在类上添加 @RestController 和 @Controller 注解,就是把这个对象交给Spring管理,Spring框架启动时就会加载该类,把对象交给Spring管理,就是Loc思想
IoC:Inversion of Control(控制反转),也就是说Spring是一个"控制反转"的容器
什么是控制反转呢? 也就是控制权反转.
什么的控制权发⽣了反转?
获得依赖对象的过程被反转了 也就是说,当需要某个对象时,传统开发模式中需要⾃⼰通过new创建对象,现在不需要再进⾏创 建, 把创建对象的任务交给容器, 程序中只需要依赖注⼊(DependencyInjection,DI)就可以了. 这个容器称为:IoC容器. Spring是⼀个IoC容器,所以有时Spring也称为Spring容器

IoC优点:
资源不由使用资源的双方管理,而是由不使用资源的第三方管理
1.资源集中管理:Loc容器会帮我们管理一些资源(对象等),我们需要使用时,只需要从IoC容器中取就可以了
2.我们在创建实例的时候不需要了解其中的细节,降低了使用资源双方的依赖程度,也就是耦合度
DI
DI (Dependency Injection) 依赖注入
IoC是一种思想,也是"目标",而思想只是一种指导原则,最终还是要有可行的落地方案,而DI就属于具体的视线,所以也可以说,DI是IoC的一种实现
二. IoC & DI 实现



三. IoC详解
前面所提到的IoC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象,也就是bean的存储
Bean的存储
要把某个对象交给IOC容器管理,需要在类上添加注解
共有两类注解可以实现:
类注解:@Controller @Service @Repository @Component @Configuration
方法注解:@Bean
@Controller(控制器存储)


ApplicationContext 翻译过来就是:Spring上下文
因为对象都交给Spring管理了,所以获取对象要从Spring中获取,那么就得先得到Spring的上下文
如果将 @Controller 去掉

获取bean对象的其他方法
ApplicationContext 也提供了其他获取bean的方式
,ApplicationContext获取bean对象的功能,是父类BeanFactory提供的功能

Bean命名约定:Bean Overview :: Spring Framework(官方文档)


可以定义Bean名字

这三种方法得到对象是同一个,地址是一样的
ApplicationContext VS BeanFactory(常见面试题)
- 继承关系和功能方面说:Spring容器有两个顶级的接口:BeanFactory和ApplicationContext。其中BeanFactory提供了基础的访问容器的功能,而ApplicationContext属于BeanFactory的子类,继承其功能,还具有独特的特性,还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持
- 从性能方面来说:ApplicationContext是一次性加载并初始化所有的Bean对象,而BeanFactory是需要哪个才去加载,因此更轻量
@Service(服务存储)


@Repository(仓库存储)


@Component(组件存储)


@Configuration(配置存储)


为什么使用这么多注释
与应用分层相呼应
@Controller:控制层,接收请求,对请求进行处理,并进行响应
@Service:业务逻辑层,处理具体的业务逻辑
@Repository:数据访问层,也成为持久层,负责数据访问操作
@Configuration:配置层,处理项目中的一些配置信息
程序应用分层,调用流程如下:


这些注解里面都有⼀个注解 @Component ,说明它们本⾝就是属于 @Component 的"子类". @Component 是⼀个元注解,也就是说可以注解其他类注解,如 @Repository 等.这些注解被称为 @Component 的衍生注解
方法注解@Bean
类注解是添加在某个类上的,但是存在两个问题
1.使用外包装类,没办法添加类注解
2.一个类,需要多个对象,比如多个数据源
这种场景就需要使用方法注解 @Bean

方法注解要配合类注解使用



可以根据名称来获取



继续使用s1


Spring会从Spring容器中,查找String类型的对象,赋值给name

扫描路径
使用五大注解声明的bean,要想生效,还需要配置扫描路径,让Spring扫描到这些注解 也就是通过 @ComponentScan 来配置扫描路径.

默认扫描的范围是SpringBoot启动类所在包及其子包

把启动类放在我们希望扫描的包的路径下,这样我们定义的bean就都可以被扫描

四. DI详解
依赖注入是一个过程,实质IOC容器在创建Bean时,去提供运行时所依赖的资源,而资源指的就是对象,简单来说,就是把对象取出来放到某个类的属性中
关于依赖注入,Spring提供了三种方式:
1.属性注入
2.构造方法注入
3.Setter注入
属性注入
属性注入使用 @Autowired 实现的,将Service类注入到Controller类中



构造方法注入

如果类只有一个构造方法,那么@Autowired 注解可以省略,如果类中有过个构造方法,默认使用无参数的构造方法,需要添加 @Autowired 来明确使用哪个构造方法
Setter 注入

三种注入优缺点分析
1.属性注入
优点:
- 简介,使用方便
缺点:
- 只适用于IoC容器
- 不能注入final修饰的属性
2.构造函数注入
优点:
- 可以注入final修饰的属性
- 注入的对象不会被修改
- 依赖对象在使用前一定会被初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段会被执行的
- 通用性好,构造方法时JDK提供的没所以更换任何框架都是适用 的
缺点:
- 注入多个对象时,代码会比较繁琐
3.Setter注入
优点:
- 方便在类实例之后,重新对对象进行配置或者注入
缺点:
- 不能注入Final修饰的属性
- 注入对象可能会被改变,因为Setter方法可能会被多次调用,就有修改的风险
@Autowired存在的问题
当同一类型存在多个bean时,就会出现问题

为了解决以上问题,Spring提供了
1.@Primary
2.@Qualifer
3.@Resource
使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现.

使⽤@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean 的名称
@Qualifier注解不能单独使⽤,必须配合@Autowired使⽤

使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称

常见面试题
@Autowired 和 @Resource 的区别
@Autowired是Spring框架提供的注解,@Resource 是JDK提供的注解
@Autowired默认是按照类型注入,@Resource默认是按照名称注入
相⽐于@Autowired 来说, @Resource ⽀持更多的参数设置,例如name设置,根据名称获取Bean


五. 总结
1.Spring ,Spring Boot 和Spring MVC的关系及区别
Spring:简单来说,Spring是一个开发应用框架,什么样的框架呢,有怎么几个标签:轻量级、一站式、模块化,其目的是用于简化企业级应用程序的开发
Spring MVC:是Spring的一个子框架,Spring诞生之后,按照MVC模式设计了一个MVC框架,主要用于开发Web应用和网络接口,所以Spring MVC是一个Web框架
Spring Boot:是对Spring的一个封装,为了简化Spring赢用的开发而出现的,可以快速搭建框架,降低开发成本,无需关注XML的配置和一些底层实现
最后一句话总结:Spring MVC 和Spring Boot 都属于Spring,Spring MVC是基于Spring的一个MVC框架,Spring Boot 是基于Spring的一套快速开发整合包

2.Bean命名

3.常见面试题
