Sping 是包含了众多工具方法的 IOC 容器,IOC是控制反转,说的是对象的创建和销毁的权利都交给 Spring 来管理了, 它本身又具备了存储对象和获取对象的能力. 。
容器:字面意思,用来容纳某种物品的装置。
比如 List/Map -》数据存储容器;Tomcat -》web容器;
而 Spring 也是一个容器,Spring 是一个 IOC 容器:
那么 IOC 是什么呢
IOC 就是控制反转,也就是 Spring 是一个 控制反转 的容器。
控制反转:之前的控制权是在我,现在反转了,也就是我把控制权交给了框架,下次我再要使用对象的时候,只需要告诉框架,我要使用这个对象。所以现在这个对象的生命周期我就不在关注了。
IOC 优点:实现代码的解耦,
Spring IoC 容器最核心的功能:
将 Bean (对象) 存储到 Spring (容器) 中
将 Bean (对象) 从 Spring (容器) 中取出来
Spring 的特点:轻量级、控制反转、AOP、声明式事务管理(注解或XML)、框架整合、测试支持。
区别:依赖注入是将依赖关系委托给容器,由容器来管理对象之间的依赖关系;
而依赖查找是由对象自己来查找它所依赖的对象,容器只负责管理对象的生命周期。
对于 Spring 容器来说:
IOC是一种思想:控制反转,定义了对象创建和依赖关系处理的方式;
DI是一种实现:依赖注入,实际提供对象依赖关系的注入功能;
相同点:ApplicationContext 和 BeanFactory 效果是⼀样的, 都可以实现从容器中获取 bean,都提供了 getBean 的方法.
不同点:
从继承关系和功能方面来看: BeanFactory 提供了基础的访问容器的能力,
而 Application 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能外,它还拥有独特的特性,还添加了对国际化支持,资源访问支持,以及事件传播等方面的支持.
从性能方面来看: Application 是一次加载并初始化所有的 Bean 对象(饿汉方式),
而 BeanFactory 是需要哪个才去加载哪个,所以更加的轻量(懒汉方式)
相同点:都可以实现将一个对象注入到类中;
不同点:
出身不同:@Resource 来自于 JDK 中,@AutoWired 来自于 Spring 框架;
用法不同:@Resource 用于 属性注入/Setter 注入,@AutoWired 用于 属性注入/构造方法注入/Setter 注入;
支持的参数不同:@Resource 支持更多的参数设置 name/type....,而 @AutoWired 只支持 required 参数设置;
Spring 中 @AutoWired 注解是通过 DI(依赖注入)实现的;
可以理解为,当 Spring 容器启动时,它会扫描应用程序中所有的 Bean,并将它们存储在一个 BeanFactory 中。当应用程序需要使用某个 Bean 时,Spring 容器会自动将该 Bean 注入到应用程序中。
再往下理解也可以说,DI 是通过 Java 反射机制实现的。具体来说,当 Spring 容器需要注入某个 Bean 时,它会使用 Java 反射机制来查找符合条件的 Bean,并将其注入到应用程序中。
所以说,@Autowired 注解是通过 DI 的方式,底层通过 Java 的反射机制来实现的。
使用 @Scope 标签来声明 Bean 的作用域,
这个五个流程可以理解为:买房子-》装修-》买家电-》入住-》卖房
Spring 和 Spring Boot 的区别在于它们的目标和用途不同。
Spring 是一个轻量级的开源框架,它提供了一种简单的方式来构建企业级应用程序。
Spring Boot 就是Java脚手架,是 Spring 框架的延伸和扩展,它提供了一种快速构建应用程序的方式。
SpringBoot 框架的特点:
MVC 是 Model View Controller 的缩写,也就是 模型-视图-控制器,它是一种设计模式。

MVC 是一种思想,而 Spring MVC 就是实现。
Spring MVC 是什么
Spring MVC 是一个 Web 框架
Spring MVC 是基于 Servlet API 构建的
@RequestMapping:路由映射,而且也可以指定一些参数比如 method、value,也可以使用其他的路由映射的注解:@PostMappring、@GetMapping
@ResponseBody 返回一个非静态页面的数据
@RestController = @ResponseBody + @Controller
后端参数重命名 @RequestParam(有些特殊情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,这样就可以在方法传参中使用 @RequestParam 进行参数重命名)
接收 JSON 格式的数据 @RequestBody(方法传参传过来的是JSON格式,这就可以使用注解 @RequestBody 进行接收)
从 URL 地址中获取参数 @PathVariable
@Slf4j 日志
@Data
.......
简单来说 MyBatis 框架简化了重复写 JDBC 的过程,可以更加方便的去操作数据库;
一般 ORM 框架会将数据库模型的每张表都映射为一个 Java 类,也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换

动态 SQL 是指可以根据不同的参数信息来动态拼接的不确定的 SQL 叫做动态 SQL,动态 SQL 是 MyBatis 的强大特性之一。

所以像这种情况就可以使用动态 sql中的if 去判断,这个字段是否为null,如果不为null就拼接到 sql 上,比传统sql语句更加的方便;
其他的动态 sql 标签还有
如果数据库字段名称和程序中属性名相同时,可以使用默认的 resultType。
如果不一致的话,需要使用 resultMap,进行返回字典映射;

这里需要区别主键映射和普通映射的写法是不同的;
AOP 是一种面向切面编程的思想,通过引入横切关注点,将其与核心业务逻辑分离,并以模块化的方式管理,通俗的说就是,AOP 是对某一类事情的集中处理。
比如以前每个页面都需要去判断用户登录的情况,而现在使用AOP后,只需要在某一处进行判断处理,那么其他页面就不需要单独重复去写用户登录校验的情况了。
所以AOP的优点就是将关注点横切从应用程序的核心业务中分离出来,更好的实现模块化和复用。
所以基于这种特点,AOP可以将通用的功能比如日志记录、登录校验、数据返回等等封转成切面,然后在需要的地方进行重用,从而提高代码的可维护性和可重用性