1. Spring 是什么
Sping 是包含了众多工具方法的 IOC 容器,IOC是控制反转,说的是对象的创建和销毁的权利都交给 Spring 来管理了, 它本身又具备了存储对象和获取对象的能力. 。
容器:字面意思,用来容纳某种物品的装置。
比如 List/Map -》数据存储容器;Tomcat -》web容器;
而 Spring 也是一个容器,Spring 是一个 IOC 容器:
那么 IOC 是什么呢
IOC 就是控制反转,也就是 Spring 是一个 控制反转 的容器。
控制反转:之前的控制权是在我,现在反转了,也就是我把控制权交给了框架,下次我再要使用对象的时候,只需要告诉框架,我要使用这个对象。所以现在这个对象的生命周期我就不在关注了。
IOC 优点:实现代码的解耦,
Spring IoC 容器最核心的功能:
将 Bean (对象) 存储到 Spring (容器) 中
将 Bean (对象) 从 Spring (容器) 中取出来
Spring 的特点:轻量级、控制反转、AOP、声明式事务管理(注解或XML)、框架整合、测试支持。
2. 依赖注入和依赖查找的区别
区别:依赖注入是将依赖关系委托给容器,由容器来管理对象之间的依赖关系;
而依赖查找是由对象自己来查找它所依赖的对象,容器只负责管理对象的生命周期。
3. DI 和 IOC 的区别是什么
对于 Spring 容器来说:
IOC是一种思想:控制反转,定义了对象创建和依赖关系处理的方式;
DI是一种实现:依赖注入,实际提供对象依赖关系的注入功能;
4. ApplicationContext 和 BeanFactory 的区别
相同点:ApplicationContext 和 BeanFactory 效果是⼀样的, 都可以实现从容器中获取 bean,都提供了 getBean 的方法.
不同点:
从继承关系和功能方面来看: BeanFactory 提供了基础的访问容器的能力,
而 Application 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能外,它还拥有独特的特性,还添加了对国际化支持,资源访问支持,以及事件传播等方面的支持.
从性能方面来看: Application 是一次加载并初始化所有的 Bean 对象(饿汉方式),
而 BeanFactory 是需要哪个才去加载哪个,所以更加的轻量(懒汉方式)
5. Sping 存储 Bean 对象的五大注解
- Controller 控制存储
- Service 服务存储
- Repository 仓库存储
- Configuration 配置存储
- Component 组件存储
6. Bean 对象的注入方式,以及有什么区别
- 属性注入:写法简单,所以日常使用频率最高,但只适用于IOC容器,通用性不好;
- 构造方法注入:从 Spring 3.4 后官方推荐的是构造方法注入,它可以注入不可变对象,并且能保证注入的对象一定是初始化过的,其通用性也更好。
- setter 注入:Spring 官方从3.4 之后就不推荐这种写法了,其通用性没构造方法注入通用;
7. @AutoWired 和 @Resource 的区别
相同点:都可以实现将一个对象注入到类中;
不同点:
出身不同:@Resource 来自于 JDK 中,@AutoWired 来自于 Spring 框架;
用法不同:@Resource 用于 属性注入/Setter 注入,@AutoWired 用于 属性注入/构造方法注入/Setter 注入;
支持的参数不同:@Resource 支持更多的参数设置 name/type....,而 @AutoWired 只支持 required 参数设置;
8. AutoWired 底层是如何实现的
Spring 中 @AutoWired 注解是通过 DI(依赖注入)实现的;
可以理解为,当 Spring 容器启动时,它会扫描应用程序中所有的 Bean,并将它们存储在一个 BeanFactory 中。当应用程序需要使用某个 Bean 时,Spring 容器会自动将该 Bean 注入到应用程序中。
再往下理解也可以说,DI 是通过 Java 反射机制实现的。具体来说,当 Spring 容器需要注入某个 Bean 时,它会使用 Java 反射机制来查找符合条件的 Bean,并将其注入到应用程序中。
所以说,@Autowired 注解是通过 DI 的方式,底层通过 Java 的反射机制来实现的。
9. Bean 将一个对象注入多次
- 精确的描述 Bean 的名称(将注入的名字写对)。
- 使用 @Resource 设置 name 的方式来重命名注入对象。
- 如果限定不能单独使用 @AutoWired,那就可以再加上使用 @Qualifier,来删选 Bean 对象。
10. Bean 有几种作用域
- singleton: 单例模式 (默认,每次请求取的是同一个对象)
- prototype: 原型模式 (多例模式,每次请求创建一个新的对象)
- request: 请求作用域 ( 表示在一次 HTTP 请求中只存在一个 Bean 实例。在同一个请求中,多次请求该 Bean 时都会返回同一个实例。不同的请求之间,该 Bean 的实例是相互独立的)
- session: 会话作用域 (表示在一个 HTTP Session 中只存在一个 Bean 实例。在同一个 Session 中,多次请求该 Bean 时都会返回同一个实例。不同的 Session 之间,该 Bean 的实例是相互独立的)
- application: 全局作用域 (表示在一个 ServletContext 中只存在一个 Bean 实例。该作用域只在 Spring ApplicationContext 上下文中有效)、
- websocket: HTTP WebSocket 作用域 (表示在一个 WebSocket 中只存在一个 Bean 实例。该作用域只在 Spring ApplicationContext 上下文中有效。)
使用 @Scope 标签来声明 Bean 的作用域,
11. Bean 的生命周期
- 实例化 Bean(给 Bean 对象分配内存空间)
- 设置属性(Bean 对象注入)
- Bean 初始化
- 使用 Bean
- 销毁 Bean
这个五个流程可以理解为:买房子-》装修-》买家电-》入住-》卖房
12. Spring 的执行流程
- 启动 Spring 容器
- 实例化 Bean (分配内存空间)
- 将 Bean 注册到 Spring 中 (存操作)
- 将 Bean 装配到需要的类中 (取操作)
13. Spring 和 SpringBoot 的区别
Spring 和 Spring Boot 的区别在于它们的目标和用途不同。
Spring 是一个轻量级的开源框架,它提供了一种简单的方式来构建企业级应用程序。
Spring Boot 就是Java脚手架,是 Spring 框架的延伸和扩展,它提供了一种快速构建应用程序的方式。
SpringBoot 框架的特点:
- 快速集成框架,SpringBoot 提供了启动添加依赖的功能;
- 内置运行容器,无需配置 Tomcat 等 Web 容器, 直接运行和部署程序;
- 快速部署项目,无需外部容器即可启动并运行项目;
- 可以完全抛弃繁琐的 XML, 使用注解和配置(yml 、properties)的方式进行开发;
- 支持更多的监控指标, 可以更好的了解项目的运行情况;
14. Spring MVC 是什么
MVC 是 Model View Controller 的缩写,也就是 模型-视图-控制器,它是一种设计模式。
MVC 是一种思想,而 Spring MVC 就是实现。
Spring MVC 是什么
Spring MVC 是一个 Web 框架
Spring MVC 是基于 Servlet API 构建的
15. Spring MVC中常使用的注解都有哪些
-
@RequestMapping:路由映射,而且也可以指定一些参数比如 method、value,也可以使用其他的路由映射的注解:@PostMappring、@GetMapping
-
@ResponseBody 返回一个非静态页面的数据
-
@RestController = @ResponseBody + @Controller
-
后端参数重命名 @RequestParam(有些特殊情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,这样就可以在方法传参中使用 @RequestParam 进行参数重命名)
-
接收 JSON 格式的数据 @RequestBody(方法传参传过来的是JSON格式,这就可以使用注解 @RequestBody 进行接收)
-
从 URL 地址中获取参数 @PathVariable
-
@Slf4j 日志
-
@Data
.......
16. MyBatis 是什么
简单来说 MyBatis 框架简化了重复写 JDBC 的过程,可以更加方便的去操作数据库;
- MyBatis 是一款优秀的持久层框架
- MyBatis 也是一个 ORM (Object Relational Mapping)框架,即对象关系映射
- 它支持自定义 SQL、存储过程以及高级映射
- MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
一般 ORM 框架会将数据库模型的每张表都映射为一个 Java 类,也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换
- 数据库表 ——》 映射为 类
- 记录(行数据) ——》映射为 对象
- 字段 ——》 映射为 对象的数据
17. Mybatis 的交互流程
- 前端通过 ajax 将请求发送到后端 controller 控制器这一层;
- controller 控制器这一层主要的工作就是验证参数的合法性,参数校验完成后,将数据发送给 service 服务器这一层;
- service 这一层主要是负责业务逻辑处理,管理接口,处理完成后将数据发送给 mapper 层;
- mapper 持久层 主要的工作就是负责和数据库交互,执行CRUD的操作,这里主要有两个 InterFace 进行声明,XML 进行实现,然后通过 @Mapper 注解将 Interface 和 xml 进行关联,从而执行sql语句;
- sql 语句执行完成后,将结果返回给 service 服务层,服务层再将结果返回给控制器,最终控制层将结果进行处理后返回给前端。
18. #{} 和 ${} 的区别
- 定义不同:#{} 预处理;而 ${} 是直接替换;
- 使用不同:#{} 适用于所有类型的参数匹配;但 ${} 只适用于数值类型(如果传的是字符串类型,$直接替换就会导致字符串没有带双引号);
- 安全性不同:#{} 性能高,并且没有安全性问题;但 ${} 存在 SQL 注入的安全问题;
19. 动态 SQL 是什么
动态 SQL 是指可以根据不同的参数信息来动态拼接的不确定的 SQL 叫做动态 SQL,动态 SQL 是 MyBatis 的强大特性之一。
所以像这种情况就可以使用动态 sql中的if 去判断,这个字段是否为null,如果不为null就拼接到 sql 上,比传统sql语句更加的方便;
其他的动态 sql 标签还有
- if :判断当前字段是否为 null,如果不为 null 就拼接到 sql 上;
- trim:去除 SQL 语句前面或后面多余的某个字符
- where :实现查询中的 where 替换
- set :进行修改操作时,配合 if 来处理非必传参数的,它的特点是会自动去除最后一个英文逗号
- foreach:对集合进行循环;
20. 查询操作时,如果数据库中的字段和对象的属性名不一致时,如果解决
如果数据库字段名称和程序中属性名相同时,可以使用默认的 resultType。
如果不一致的话,需要使用 resultMap,进行返回字典映射;
这里需要区别主键映射和普通映射的写法是不同的;
21. Spring AOP 是什么
AOP 是一种面向切面编程的思想,通过引入横切关注点,将其与核心业务逻辑分离,并以模块化的方式管理,通俗的说就是,AOP 是对某一类事情的集中处理。
比如以前每个页面都需要去判断用户登录的情况,而现在使用AOP后,只需要在某一处进行判断处理,那么其他页面就不需要单独重复去写用户登录校验的情况了。
所以AOP的优点就是将关注点横切从应用程序的核心业务中分离出来,更好的实现模块化和复用。
所以基于这种特点,AOP可以将通用的功能比如日志记录、登录校验、数据返回等等封转成切面,然后在需要的地方进行重用,从而提高代码的可维护性和可重用性
22. Spring AOP 的实现原理
http://t.csdnimg.cn/bjEEk
23. Spring AOP 的应用有哪些,拦截器如何实现
http://t.csdnimg.cn/QJnlv