1. 什么是AOP和IOC?
Ioc(控制反转)
- 控制反转(Inversion of Control)是一种设计原则,用来减少计算机程序中的依赖关系,它允许程序在运行时动态地适应和配置对象之间的关系。在Java中,IoC通常通过依赖注入(DI)实现,其实就减少我们在业务层通过new 来创建dao层对象。
- 依赖注入(DI):组件之间的依赖关系由容器在运行时注入,而不是在代码中硬编码。
Aop(面向切面编程)
可以理解为面向方法编程,底层通过动态代理机制实现对目标方法编程
2.Spring常用注解
-
@Component
:用于标识一个类为Spring的组件。 -
@Repository
:用于标识一个类为数据访问组件。 -
@Service
:用于标识一个类为服务组件。 -
@Controller
:用于标识一个类为Spring MVC中的控制器。 -
@Autowired
:用于自动装配Bean。 -
@Qualifier
:与@Autowired
一同使用,指定注入的Bean的名称。 -
@Value
:用于注入属性值。 -
@Configuration
:标识一个类为配置类。 -
@Bean
:在配置类中使用,用于声明一个Bean。 -
@Scope
:用于指定Bean的作用域。 -
@PostConstruct
:在Bean初始化完成后执行的方法。 -
@PreDestroy
:在Bean销毁之前执行的方法。
。。。
3. Spring Bean的生命周期与作用域
-
生命周期:
-
实例化:通过构造方法或工厂方法创建Bean实例。
-
属性赋值:通过setter方法或直接赋值将属性注入。
-
初始化:调用
@PostConstruct
注解的方法或实现InitializingBean
接口的afterPropertiesSet
方法。 -
使用:Bean可以被应用程序使用。
-
销毁:调用
@PreDestroy
注解的方法或实现DisposableBean
接口的destroy
方法。
-
-
作用域:
-
singleton(默认): 在整个Spring容器中只有一个Bean实例。
-
prototype: 每次注入或者通过
getBean
方法获取Bean时,都会创建一个新的实例。 -
request: 每个HTTP请求都会创建一个新的实例,仅在Web应用中有效。
-
session: 每个HTTP Session都会创建一个新的实例,仅在Web应用中有效。
-
global-session: 类似于
session
作用域,但在整个应用的全局范围内有效,仅在Web应用中有效。
-
4. Spring的自动装配
Spring的自动装配是通过@Autowired
注解实现的。它可以自动将符合类型的Bean注入到需要的地方。有三种自动装配的方式:
-
按类型自动装配(byType): 通过属性的数据类型自动匹配并注入。
-
按名称自动装配(byName): 通过属性的名称与Bean的名称匹配并注入。
-
构造器自动装配(constructor): 类似于按类型自动装配,但是应用于构造方法。
5. Spring框架中都用到了哪些设计模式?
在Spring框架中,常见的设计模式包括:
-
单例模式(Singleton): Spring默认情况下使用单例模式,保证一个Bean在容器中只有一个实例。
-
工厂模式(Factory): Spring使用工厂模式通过
ApplicationContext
来创建和管理Bean。 -
代理模式(Proxy): Spring AOP的实现就使用了代理模式,包括静态代理和动态代理。
-
观察者模式(Observer): Spring中的事件机制就是观察者模式的一种实现。
-
策略模式(Strategy): Spring中的
@Qualifier
注解用于解决自动装配时的歧义性,可以看作是策略模式的一种应用。
这些设计模式有助于提高代码的可维护性、可扩展性,并降低组件之间的耦合度。
6. MyBatis中#{}和${}的区别
-
#{}: 用于预编译,将参数以占位符的形式传入SQL语句,MyBatis会使用PreparedStatement预编译SQL,可以有效防止SQL注入攻击。
SELECT * FROM users WHERE id = #{userId}
-
${}: 直接将参数值拼接在SQL语句中,不进行预编译。存在SQL注入的风险,应该避免直接使用用户输入的值。
SELECT * FROM users WHERE id = ${userId}
使用#{}
更安全,能够防止SQL注入,同时也能防止一些特殊字符引起的问题。
7. MyBatis的优缺点
优点:
-
简化数据库操作: MyBatis能够通过映射文件将Java对象与数据库表进行关联,提供了简单的CRUD操作。
-
动态SQL: MyBatis支持动态SQL,可以根据不同的条件生成不同的SQL语句,提高了灵活性。
-
缓存机制: MyBatis提供了一级缓存和二级缓存,能够提高查询性能。
-
灵活的映射: 提供了强大的结果映射功能,支持复杂对象的映射。
缺点:
-
学习成本: 对于初学者来说,学习MyBatis需要掌握XML配置以及一定的SQL知识,相对于使用ORM框架的学习曲线可能较陡峭。
-
繁琐的XML配置: 需要进行大量的XML配置,可能会显得繁琐,尤其是对于简单的CRUD操作。
-
与数据库的耦合: 在使用MyBatis时,需要编写SQL语句,这使得应用与特定的数据库有一定的耦合性。
8. Spring MVC的常用注解
Spring MVC中的常用注解包括:
-
@Controller
:用于标识一个类为Spring MVC的Controller。 -
@RequestMapping
:用于映射请求的URL到具体的处理方法。 -
@RequestParam
:用于从请求中获取参数值。 -
@PathVariable
:用于将URL中的模板变量映射到方法参数。 -
@ModelAttribute
:用于在请求处理方法执行前将一些预处理的操作放在model中,通常用于数据绑定。 -
@ResponseBody
:用于将方法返回的对象转换为JSON格式或其他格式的响应体。 -
@ResponseStatus
:用于指定方法返回的HTTP状态码和原因。 -
@SessionAttributes
:用于声明哪些模型属性应该存储在会话中。 -
@ExceptionHandler
:用于定义在Controller内部处理异常的方法。 -
@InitBinder
:用于定义初始化数据绑定器的方法。
9. Spring MVC执行流程
Spring MVC的执行流程包括:
-
请求的到达: 客户端发送HTTP请求到达前端控制器(DispatcherServlet)。
-
处理器映射器匹配处理器: DispatcherServlet调用处理器映射器(HandlerMapping)来匹配请求到一个处理器(Controller)。
-
处理器执行: 处理器执行,进行业务逻辑处理。
-
视图解析器解析视图: 处理器返回一个逻辑视图名,DispatcherServlet调用视图解析器(ViewResolver)解析为具体的视图。
-
视图渲染: 视图渲染将模型数据填充到视图中。
-
响应返回: 渲染后的视图返回给前端控制器,前端控制器将响应返回给客户端。
10. @SpringBootApplication介绍
@SpringBootApplication
是一个组合注解,用于标注一个主配置类,通常是Spring Boot应用的入口类。它包含了以下三个注解的组合:
-
@Configuration
:标识该类是一个配置类,可以被AnnotationConfigApplicationContext或ClassPathXmlApplicationContext扫描并用于构建Bean定义。 -
@EnableAutoConfiguration
:开启Spring Boot的自动配置功能,根据类路径下的依赖库自动配置Spring框架所需的Bean。 -
@ComponentScan
:自动扫描并加载符合条件的组件(包括@Controller、@Service等),使其成为Spring容器中的Bean。
这一个注解的使用简化了配置,使得开发者可以更加专注于应用的业务逻辑而不用过多关心框架的配置。
11. Spring、Spring MVC、Spring Boot的区别
-
Spring: 是一个全功能的企业级框架,提供了大量的功能,包括依赖注入、AOP、事务管理、数据访问等。Spring是一个容器,负责管理和组织各个组件。
-
Spring MVC: 是Spring框架的一部分,用于构建Web应用程序的MVC框架。它提供了一个基于注解的模型,支持灵活的URL映射、视图解析、数据绑定等,用于处理Web请求和响应。
-
Spring Boot: 是Spring团队提供的用于简化和加速Spring应用程序开发的框架。Spring Boot通过约定大于配置的方式,提供了一套开发规范,可以快速搭建、开发和部署Spring应用,使得开发者能够更专注于业务逻辑。
12. Spring Boot常用注解
-
@SpringBootApplication
:标记主程序类,表示这是一个Spring Boot应用。 -
@Controller
:用于标识一个类为Spring MVC的Controller。 -
@RestController
:结合@Controller
和@ResponseBody
,用于标识RESTful风格的Controller。 -
@RequestMapping
:用于映射请求的URL到具体的处理方法。 -
@Autowired
:用于自动装配Bean。 -
@Value
:用于注入配置文件中的值。 -
@Configuration
:标识一个类为配置类。 -
@Bean
:在配置类中使用,用于声明一个Bean。 -
@Service
:用于标识一个类为服务组件。 -
@ComponentScan
:用于指定要扫描的包。
13. 数据库设计三大范式
-
第一范式(1NF): 数据表中的每一列都是不可拆分的基本数据项,不包含重复的列。确保每个字段的原子性。
-
第二范式(2NF): 在满足1NF的基础上,非主键属性完全依赖于主键,而不是部分依赖。表中不存在部分依赖关系。
-
第三范式(3NF): 在满足2NF的基础上,消除传递依赖。即非主键属性不依赖于其他非主键属性。
14. MySQL存储引擎MyISAM与InnoDB的区别
-
MyISAM:
-
不支持事务,不支持外键。
-
表级锁定,对于读操作效率较高,但在写操作并发性能较差。
-
支持全文本索引。
-
-
InnoDB:
-
支持事务和外键。
-
行级锁定,对于写操作并发性能较好。
-
支持事务的ACID特性。
-
支持外键约束。
-
选择存储引擎要根据应用场景和需求进行权衡,MyISAM适合读密集型操作,而InnoDB适合写密集型操作和要求事务支持的场景。
15. 什么是索引?索引的优缺点?
-
索引: 索引是数据库表中一列或多列的值,用于提高查询速度。通过索引,数据库可以快速定位到表中的特定行,而不必扫描整个表。
-
索引的优点:
-
提高检索速度,加速数据查询。
-
加速表与表之间的连接。
-
通过唯一索引强制数据完整性。
-
-
索引的缺点:
-
占用额外的存储空间。
-
对数据的插入、删除和更新操作会有一定的性能影响。
-
创建和维护索引需要额外的时间和资源。
-
不当使用索引可能导致查询性能下降,例如过多的索引或者不合适的索引选择。
-
在设计索引时需要根据实际的查询场景和数据特点进行综合考虑,合理使用索引以提高查询性能。
16. 索引的类型与种类
主要的索引类型有:
-
单列索引: 对表中的单个列创建的索引。
-
唯一索引: 与普通索引类似,但要求所有的索引列的值都是唯一的。
-
复合索引: 对表中的多个列创建的索引,可以包含多个列的值。
-
全文本索引: 用于全文搜索的索引,适用于文本字段。
-
空间索引: 用于空间数据类型(GIS数据类型)的索引。
17. 项目中如何使用索引
在项目中使用索引时,需要注意以下几点:
-
选择合适的字段: 根据查询的需求选择合适的字段创建索引,避免过多或不必要的索引。
-
避免过多的索引: 过多的索引不仅占用存储空间,而且在更新操作时会增加维护成本,同时可能引发查询优化器选择不合适的索引。
-
避免在小表上创建索引: 对于小型表,全表扫描可能更为高效,不需要额外的索引。
-
定期维护和优化索引: 定期检查和优化索引,删除不再使用的索引,重新组织索引以提高性能。
18. 如何查看索引是否生效
可以通过执行数据库的性能优化工具或者使用数据库管理工具进行查看。在MySQL中,可以使用EXPLAIN
关键字来查看查询的执行计划,观察是否使用了索引。
EXPLAIN SELECT * FROM your_table WHERE your_condition;
19. 索引生效规则与避免失效
索引生效规则:
-
尽量使用覆盖索引,即索引包含了查询所需的所有列。
-
索引列的数据类型要匹配,避免类型转换。
-
在多表连接时,连接条件上的字段应该创建索引。
-
在使用范围查询时,确保被查询的字段上有索引。
避免索引失效:
-
避免在索引列上使用函数,这会导致索引失效。
-
尽量避免使用
OR
条件,可以改写为UNION
。 -
谨慎使用通配符(例如
%
)开头的LIKE
查询。 -
避免在索引列上进行计算或使用表达式。
-
注意不要过度索引,过多的索引可能导致优化器选择不合适的索引。
20. 唯一索引和主键索引的区别
-
主键索引: 主键索引是一种特殊的唯一索引,它要求索引列的值唯一且不为空。一个表只能有一个主键索引,主键索引通常用于唯一标识表中的每一行记录。
-
唯一索引: 唯一索引要求索引列的值在整个表中唯一,但允许有空值。一个表可以有多个唯一索引。
在使用上,主键索引通常用于标识一条记录,而唯一索引用于保证某一列或多列的值的唯一性。主键索引自带聚簇索引的特性,而唯一索引在MySQL中可以选择是否使用聚簇索引。
21. 大表数据查询如何进行优化?
针对大表数据查询的优化,可以考虑以下方面:
-
合理使用索引: 确保查询的字段上有合适的索引,避免全表扫描。
-
分区表: 使用分区表将表数据分散存储,可以加速查询操作。
-
分页查询: 对于用户界面展示,使用分页查询,限制每次查询的返回行数。
-
定期维护统计信息: 定期分析表的统计信息,确保优化器能够选择最优的执行计划。
-
垂直拆分和水平拆分: 将大表拆分成多个小表,或者将表按列进行拆分,减小单表的数据量。
-
使用缓存: 对于一些静态数据,可以考虑使用缓存来减轻数据库的压力。
22. MySQL和Oracle的区别?
MySQL和Oracle的主要区别包括:
-
开发公司: MySQL由瑞典MySQL AB公司开发,现在属于Oracle公司;Oracle是由美国Oracle公司开发。
-
许可方式: MySQL使用GPL许可证,免费开源;Oracle数据库是商业数据库,需要购买许可证。
-
性能和规模: Oracle通常被认为适用于大型企业级应用,而MySQL适用于中小型应用。
-
事务处理: Oracle对事务处理和并发性能有更好的支持,支持更高级的事务隔离级别。
-
存储过程和触发器: Oracle的存储过程和触发器支持更丰富,拥有更多的功能。
23. UNION与UNION ALL 的区别
UNION和UNION ALL的主要区别:
-
UNION: 对两个或多个查询的结果集进行合并,同时去除重复的行。即,如果两个查询的结果集中存在相同的行,则只保留一次。
-
UNION ALL: 也对两个或多个查询的结果集进行合并,但不去除重复的行,即保留所有行,包括重复的行。
区别总结:
-
UNION会对结果集进行去重,性能较差,但返回的结果集不包含重复行。
-
UNION ALL直接合并结果集,性能较好,但返回的结果集可能包含重复行。
24. 什么情况下会用到联合索引,以及生效规则
联合索引(Composite Index): 是指对表的多个列进行组合的索引,用于加速查询涉及这些列的条件。
使用场景:
-
当查询语句中涉及多个列的条件,并且这些列组合在一起是唯一的,可以考虑使用联合索引。
生效规则:
-
联合索引的生效规则和查询条件的顺序有关,通常来说,如果查询条件中使用了索引的左侧列,索引会被用到。例如,对于
(a, b, c)
的联合索引,查询条件WHERE a = 1 AND b = 2
可以使用该索引,而WHERE b = 2 AND c = 3
无法使用。 -
联合索引在满足最左匹配原则的情况下能够提供索引的优化。
25. SQL优化的一般步骤,如何看执行计划(EXPLAIN),如何理解其中各个字段的含义。
SQL优化一般步骤:
-
分析SQL语句: 仔细阅读和分析SQL语句,理解其逻辑。
-
使用索引: 确保查询的字段上有合适的索引。
-
避免全表扫描: 尽量避免在大表上进行全表扫描,考虑使用合适的索引。
-
优化查询条件: 确保查询条件能够充分利用索引,避免使用不必要的函数包装字段。
-
使用合适的连接方式: 根据实际需求选择合适的连接方式,如INNER JOIN、LEFT JOIN等。
-
限制返回行数: 对于用户界面展示,使用分页查询限制每次查询的返回行数。
执行计划(EXPLAIN):
在MySQL中,可以使用EXPLAIN
关键字查看SQL语句的执行计划,例如:
EXPLAIN SELECT * FROM your_table WHERE your_condition;
各个字段的含义:
-
id: 查询标识,表示查询的序列号,可以忽略。
-
select_type: 查询类型,如SIMPLE、PRIMARY等,表示查询的复杂度。
-
table: 表名,表示哪个表参与查询。
-
type: 访问类型,表示查询时使用了何种访问方法,如ALL、INDEX等。
-
possible_keys: 显示可能应用在这张表中的索引,但不一定被查询使用。
-
key: 实际使用的索引。
-
key_len: 表示索引中被选择的长度。
-
ref: 显示索引的哪一列被使用了,如果可能的话,是一个常数。
-
rows: 表示MySQL认为必须检查的用来返回请求数据的行数。
-
Extra: 包含MySQL解决查询的一些额外信息,如使用了临时表、使用了文件排序等。