1.数据库的三范式是什么
数据库的三范式是指数据库设计的一种规范,用来规定如何将数据进行组织和存储,以便减 少冗余、提高数据的一致性和准确性。具体来说,三范式分为三个层次: 第一范式(1NF)要求每个表中的每个字段都是原子性的,不可再分。即每个字段中不能包含多个 值或者数组。 第二范式(2NF)要求表中的非主键字段完全依赖于主键,也就是说,非主键字段必须完全取决于 整个主键,而不是只取决于部分主键。 第三范式(3NF)要求表中的非主键字段不依赖于其他非主键字段。换句话说,任何字段不能由其 他字段派生出来,而应该直接与主键相关。
数据库的三范式是:
- 第一范式(1NF):要求属性具有原子性,不可再分解。
- 第二范式(2NF):是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
- 第三范式(3NF):是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
2.为什么要使用 Spring?
Spring是一个轻量级的开发框架,提供了丰富的特性和模块,帮助开发者简化开发过程,提 高代码的可测试性、可维护性和可扩展性,同时支持面向切面编程、依赖注入等.
- 解耦:Spring提供的IoC容器可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。这使得代码更易于理解和维护。
- 简化开发:Spring提供了大量的功能,例如事务管理、对象关系映射、数据访问等,这些功能大大简化了Java开发。
- 测试方便:Spring可以方便地进行单元测试和集成测试,因为它支持依赖注入和模拟对象,这使得测试不再是昂贵的操作,而是随手可做的事情。
- 集成优秀框架:Spring不排斥各种优秀的开源框架,相反,它可以降低各种框架的使用难度,提供了对各种优秀框架(如Struts、Hibernate、Quartz)等的直接支持。
- 支持面向切面的编程(AOP):通过Spring提供的AOP功能,可以方便地进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
- 声明式事务管理:在Spring中,我们可以从繁琐的事务管理代码中解脱出来,通过声明式轻松经行事物的管理,提高开发效率与质量。
3.解释一下什么是 AOP?
AOP(Aspect-Oriented Programming)是一种编程范式,用于将与业务逻辑无关的横切 关注点(如日志、事务管理)从主要业务逻辑中分离出来,以便重用和管理。
AOP(Aspect Oriented Programming)是一种编程思想,它通过预编译和运行期动态代理的方式实现程序功能的统一维护。AOP也被认为是OOP(面向对象编程)的延续,是软件开发中的一个热点。
在AOP中,切面(Aspect)是用来拦截调用过程、方法、接口等的技术,可以用来实现日志记录、事务处理、安全性控制、性能管理等跨多方法甚至跨多个类的功能。在Spring框架中,AOP是一个重要的功能,通过AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
4.解释一下什么是 IOC?
IOC(Inversion of Control)是一种设计原则,它将对象的创建和管理交给容器,而不是由 程序员手动管理。Spring的IOC容器负责创建、注入和管理对象。
IOC(控制反转)是一种设计原则,它通过把创建对象的权利交给外部容器来控制,降低了对象之间的耦合度,提高了系统的可扩展性和可维护性。
在传统的程序设计中,对象之间的依赖关系通常是通过硬编码来确定的,这样会导致对象之间的耦合度很高,一旦需要改变对象之间的依赖关系,就需要修改代码,增加了维护的难度。而控制反转通过将对象的创建和使用分离,使得对象的依赖关系可以动态地被注入,从而降低了对象之间的耦合度。
控制反转的实现方式有多种,其中最常用的是依赖注入(DI),即由外部容器在运行期间动态地将依赖关系注入到对象中。通过依赖注入,可以将对象的依赖关系和具体实现分离,使得对象的使用和具体实现可以独立地改变,提高了系统的可维护性和可扩展性。
在Spring框架中,控制反转是一个核心功能,通过使用IoC容器来管理对象的创建和使用,可以方便地实现依赖注入和其他控制反转的功能。
5.Spring 有哪些主要模块?
Spring包括核心容器、AOP模块、数据访问/集成模块、Web模块和消息模块等主要模块, 用于支持不同的开发需求。
Spring框架主要包括以下模块:
- Spring Core:这是Spring框架的最基础部分,提供IoC容器,对bean进行管理。
- Spring Context:基于bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。
- Spring DAO:提供了JDBC的抽象层,可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法。
- Spring ORM:提供了常用的“对象/关系”映射APIs的集成层,其中包括JPA、JDO、Hibernate、MyBatis等。
- Spring AOP:提供了符合AOP Alliance规范的面向方面的编程实现。
- Spring Web:提供了基础的Web开发的上下文信息,可与其他web进行集成。
6.Spring 常用的注入方式有哪些?
Spring的常用注入方式有构造器注入、属性注入和方法注入
Spring框架常用的注入方式主要有以下几种:
- 构造器注入:通过类的构造方法来实现注入。这种方式需要在类中定义一个带有参数的构造方法,并将需要注入的属性作为参数传递给构造方法。Spring容器在实例化对象时会调用带有参数的构造方法,将属性值注入到对象中。
- 属性注入:通过属性的setter方法来实现注入。这种方式要求类中提供对应属性的setter方法,并在setter方法上添加注解(如@Autowired、@Resource等),Spring容器会自动调用这些setter方法,将属性值注入到对象中。
- 方法注入:通过类中的方法来实现注入。这种方式要求类中提供对应的方法,并在方法上添加注解(如@PostConstruct等),Spring容器会自动调用这些方法,将属性值注入到对象中。
7.Spring 中的 bean 是线程安全的吗?
默认情况下,Spring中的单例(Singleton)bean是线程不安全的,多个线程可能共享同一 个实例。如果需要线程安全的bean,可以使用原型(Prototype)作用域。
在Spring中,bean是否线程安全取决于具体的实现方式。
如果bean是基于prototype类型的,即每次创建的是一个新对象,因此不存在线程之间的Bean共享,自然不会有线程安全的问题。
而对于singleton类型的bean,所有线程共享一个单例实例Bean,因此存在资源的竞争。如果Bean是有状态的,就需要开发人员自己来进行线程安全的保证,最简单的就是改成prototype类型的bean。
另外,如果默认注入的Bean对象没有设置scope,那么它也是线程不安全的。
因此,Spring不保证所有的bean都是线程安全的,线程安全问题需要结合具体的bean类型和状态来考虑。在多线程环境下使用bean时,开发人员需要自己保证线程安全。
8.Spring 自动装配 bean 有哪些方式?
Spring自动装配bean有三种方式,分别是no(默认不自动装配)、byName(根据属性名 自动装配)和byType(根据属性类型自动装配)。
Spring自动装配bean的方式有五种,分别是:no、byName、byType、constructor、autodetect。
- no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。
- byName:通过参数名 自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置为 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
- byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置为 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。
- constructor:这个方式类似于 byType,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
- autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。
9.Spring 支持几种 bean 的作用域?
Spring支持五种bean的作用域,分别是单例(Singleton)、原型(Prototype)、会话 (Session)、请求(Request)和全局会话(Global Session)。
Spring支持五种bean的作用域,分别是:
- singleton:默认作用域,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。
- prototype:为每一个bean请求提供一个实例。
- request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
- session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
- global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
10.Spring 事务实现方式有哪些?
Spring事务实现方式包括编程式事务管理和声明式事务管理。声明式事务管理可以基于XML 配置或基于注解。
Spring的事务实现方式主要有以下几种:
- 编程式事务:在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法。
- 基于TransactionProxyFactoryBean的声明式事务管理。
- 基于@Transactional的声明式事务管理。
- 基于Aspectj AOP配置事务。
11.说一下 Spring 的事务隔离?
Spring的事务隔离级别包括READ_UNCOMMITTED、READ_COMMITTED、 REPEATABLE_READ和SERIALIZABLE。不同的隔离级别决定了事务之间的可见性和并发性。
Spring的事务隔离级别有四个,分别是:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。
- 读未提交(read uncommitted):事务尚未提交,其他事务即可以看到该事务的修改结果。隔离级别最差,脏读、不可重复读、幻读都不能避免。
- 读提交(read committed):事务只能看到其他事务提交之后的数据。可避免脏读,不可重复读、幻读无法避免。
- 可重复读(repeatable read):一个事务多次查询,无论其他事务对数据如何修改,看到的数据都是一致的。因为A事务查询数据时,若B同时在修改数据,A事务看到的永远是B事务执行前的数据。只有当A提交或者回滚之后,看到的才是最新的被B修改的数据。
- 串行化(serializable):这是数据库的默认隔离级别,完全遵循ACID原则,确保事务串行执行。这种级别可以避免脏读、不可重复读、幻读发生。
12.说一下 Spring MVC 运行流程?
Spring MVC的运行流程包括请求的分发、处理器映射、处理器适配、处理器执行、视图解 析、视图渲染等步骤。
Spring MVC的运行流程主要分为以下步骤:
- 用户发送请求,前端控制器(DispatcherServlet)接收请求。
- DispatcherServlet调用HandlerMapping来查找可以处理该请求的处理器(Handler)。
- HandlerMapping根据请求的URL查找对应的处理器。
- HandlerAdapter按照特定的规则去执行Handler。
- 在Handler执行前后,会先执行拦截器的preHandle方法,后执行postHandle方法。
- Handler执行完成后,会返回一个ModelAndView对象,该对象包含了视图信息和模型数据。
- 如果需要渲染页面,DispatcherServlet会根据视图解析器(ViewResolver)解析视图名称,得到真正的视图对象。
- 最后,DispatcherServlet将ModelAndView对象传递给视图对象进行页面渲染。
13.Spring MVC 有哪些组件?
Spring MVC包括控制器(Controller)、处理器映射(Handler Mapping)、处理器适配 (Handler Adapter)、视图解析器(View Resolver)等组件。
Spring MVC的组件主要包括以下几类:
- 核心组件:DispatcherServlet、ModelAndView、Controller。
- 拦截器组件:HandlerInterceptor。
- 视图解析器组件:ViewResolver。
- 主题解析器组件:ThemeResolver。
- 资源处理组件:MultipartResolver。
- 异常处理器组件:HandlerExceptionResolver。
- 请求到视图名称翻译器组件:RequestToViewNameTranslator。
- 区域解析器组件:LocaleResolver。
这些组件协同工作,使得Spring MVC能够处理请求、解析视图、处理异常等。
14.@RequestMapping 的作用是什么?
@RequestMapping是Spring MVC中的注解,用于映射请求路径到处理方法,指定请求的 HTTP方法、路径等。
@RequestMapping 是一个注解,用于处理请求地址映射,可以作用于类或方法上。它用于将 HTTP 请求地址与 Controller 类的方法进行映射。当使用 @RequestMapping 注解时,被注解的类或方法会处理与注解中指定的 URL 地址匹配的 HTTP 请求。
具体来说,如果 @RequestMapping 注解用于类上,那么该类中的所有响应请求的方法都以该地址作为父路径。如果用于方法上,那么在类的父路径下追加方法上注解中的地址将会访问到该方法。
总之,@RequestMapping 是 Spring MVC 中非常重要的组件之一,用于将请求映射到对应的方法进行处理,使 MVC 三层架构更加清晰、易于维护和重用。
15.@Autowired 的作用是什么?
@Autowired是Spring的注解,用于自动装配bean的属性,可以实现依赖注入,避免手动 创建和设置对象。
@Autowired 是一个注解,在 Spring 框架中,它用于自动装配 bean。具体来说,@Autowired 注解可以用于类中的成员变量、方法及构造函数,让 Spring 完成 bean 的自动装配工作。默认情况下,@Autowired 是按照类去匹配,但也可以配合 @Qualifier 注解按照名称去装配 bean。这样可以简化 Spring 配置,同时提高代码的可测试性和可维护性。