核心概念
是什么?
spring spring boot 都是轻量级开发框架,为了简化Java开发,整合了很多默认配置,能够很快起步。
Spring 框架中都用到了哪些设计模式?
spring包含哪些模块?
Web:包括Web MVC、Websocket
IOC
什么是Spring IOC 容器?有什么作用 ?优点是什么?实现机制?
BeanFactory 和 ApplicationContext有什么区别?
答:FactoryBean和beanfactory不是一个东西,FactoryBean是创建实例对象的方式,造出来的对象是getobject()中的对象。
ApplicationContext通常的实现是什么?
答:是个接口,有具体的实现类。filesystemxmlApplicationContext从系统文件加载配置资源;classpathxmlApplicationContext从类路径中加载配置资源,xmlwebApplicationContext针对web服务加载配置资源。AnnotationConfigApplicationContext使用配置类加载配置。
bean的生命周期
答:实现两个接口,实现初始化和销毁。
什么是依赖注入?依赖注入有什么优势?有哪些不同类型的依赖注入实现方式?
定义:IOC是一种编程思想,将程序中对象之间的依赖关系的控制权反转交给外部容器来处理,DI是IOC思想的一种具体实现,通过容器来管理创建实例对象,并且配置好所需的依赖关系。
优势:解耦;更加容易进行配置管理。
依赖注入的实现方式:
setter注入:Java类中为需要的属性提供setter方法,然后在spring配置文件中配置对应的属性property,基本数据类型是value,引用类型是ref。
构造器注入:Java类中使用带参构造方法接收需要注入的依赖,spring配置文件中用constructor-arg来指定配置的值,基本数据类型是value,引用类型是ref。强制依赖。
自动装配:常用的是按类型、按名称。Java类中用setter方法注入,配置文件中用autowire来按名称按类型装配。后面应该有@Autowired注解。
构造器注入和setter注入的区别:通过构造函数提供的参数都是必须的,而setter注入的依赖是可选的。当有必要的,不能改变的依赖时,使用构造器注入,适合少量;而有大量属性需要注入时,选择setter.
什么是spring bean?
答:bean就是被IOC容器管理的对象。通过配置可以告诉IOC我们要管理的对象。可以是xml配置文件、注解或者配置类。
怎样定义bean的作用域?
答:scope属性来指定,包括singleton单例,prototype每次使用创建一个对象。request:每次http请求都会创建一个bean;session:每一次来自新session的HTTP请求都会产生一个新的bean
Spring框架中的bean是线程安全的吗?
答:bean默认是单例模式,spring框架下没有给它进行多线程的封装设计。如果用到的bean是无状态数据,那么这种情况下是线程安全的,如果bean是有状态,那么不是线程安全。
有状态是指有数据存储功能,无状态是指不会保存数据。
1、最简单就是改变bean的作用范围,scope从singleton改为prototype,用一个就创建一个实例。
2、在类中定义一个threadLocal成员变量,将可变变量存在threadlocal中。(注意用完要使用remove,防止内存泄漏)。
如何理解spring的注解?
答:spring通过注解的方式来管理配置文件以及容器中对象的依赖注入,简化了配置方式和开发过程。最开始是通过xml和classpathxmlapplicationcontext来实现,使用注解之后能够简化配置,提高代码的可读性。
将一个类声明为 Bean 的注解有哪些?
答:@Component 通用的注解,可以定义任意一层,衍生出几个功能一样的注解,只是通过注解的名字能够更清楚地知道类的使用场景和意图。@Service 属于服务层,以更好的方式指明了意图,@Reposity作为数据仓储层,导入ioc容器,并使未经检查的异常转DataAccessException,@Controller作为控制层的注解,标有它的bean自动导入IOC容器中。
@Configuration注解声明为配置类,@ComponentScan注解用于扫描路径。
使用注解时,bean的作用范围和生命周期怎么设置?
答:在配置@Reposity的注解下,加上注解@scope来配置作用范围。定义初始化和注解方法,给初始化方法加上@postconstruct注解(构造方法后),销毁方法加上@predestroy注解即可(彻底销毁前)。
@Required 注解有什么作用
答:表示bean的属性必须在配置的时候设置。但是现在这种已经过时,必要的配置通过构造来注入依赖。
@Autowired 注解有什么作用
答:使用了autowired注解之后,可以不用setter方法了(但带参构造函数仍然需要),简化了开发。能够自动装配、按类型装配,也支持@Qualified注解指定属性装配一个bean。
如果是基本数据类型或者string直接用@Value("值“)进行注入,可以用配置属性的值:配置类扫扫描属性文件,@Value里用${}进行配置。
@Autowired和@Resource之间的区别
答:前者是spring中自带的注解,后者是JDK提供的注解;前者默认使用类型进行装配,如果存在多个类型一样的bean,需要qualified注解显示指定使用哪一个,后者默认按名称进行装配;前者支持在构造函数、方法、字段、参数上使用,后者支持在字段和方法上注入,不支持构造函数和参数。
@Component 和 @Bean 的区别是什么?
答:@component注解用于类,@bean注解用于方法。@component注解用于自动扫描和装配,@bean注解用于明确创建一个bean,要用的时候返回这个对象。使用场景:@component注解用于自己的类进行扫描和识别,@bean注解用于明确声明bean(return了一个对象),尤其是使用第三方的方法时。
如果我整合的bean也就是@bean需要依赖怎么办:引用类型用方法的形参自动装配,基本类型用形参。
bean的生命周期了解吗?
答:太多了不是很清楚。简单回答一下可以分为以下几步:
实例化:容器实例化对象;
属性填充:通过反射设置bean的属性,可以理解为依赖注入
初始化:如果bean有初始化方法或定义了某些特定接口,会调用这些方法。
使用:已准备好,可以使用。
销毁:容器关闭时,如果定义了销毁方法,会使用这些方法。
AOP
AOP是什么?如何理解AOP?
答:AOP是指面向切面编程,它的核心思想是指在不惊动原始代码的基础之上增强代码的功能,通过动态代理来实现。将散落在各个业务中的横切关注点,从他们所影响得业务逻辑中分离出来,进行统一集中管理。无入侵式处理。
连接点:源代码中的任意位置,可以进行增强的任意位置。
切入点:指定哪些连接点需要被增强的表达式,通常是一个表达式(例如以select开头的方法)。
通知:是指对源代码进行增强的具体实现。
切面:描述了通知和切入点之间的关系,比如在哪些切入点需要执行哪些操作。
目标:被通知的对象。
代理:向目标对象应用通知之后创建的代理对象。AOP在进行代码增强时,不会修改目标对象的源代码,而是会创建一个代理对象来封装目标对象,执行与增强相关的通知代码,然后委托给目标对象执行源代码的逻辑。
织入:把切面应用到目标对象并且创建新的代理的过程。
Spring AOP and AspectJ AOP 有什么区别?AOP 有哪些 实现方式?
答:AOP是西安的关键就是代理模式,分为静态代理和动态代理,其中前者是动态代理,AspectJ为静态代理。Spring AOP主要支持方法级别的切入点,而AspectJ提供了更为强大和灵活的切入点定义能力。
AspectJ是静态代理的实现,意思就是说AOP框架在编译运行阶段生成AOP代理类,因此也被称为编译时增强,会在编译时将增强的代码织入Java字节码中,运行的时候就是增强后的内容。编译时加入增强代码,性能会快一些。
spring AOP是动态代理实现,就是说AOP框架不会修改字节码,而是每次运行时在内存中为方法生成一个AOP对象,处理增强代码,并且委托目标对象执行原始代码逻辑。基于代理,运行时会多一些花销。
AOP的实现方式:代理方式(spring AOP)、字节码操纵、编译时增强。
AspectJ 定义的通知类型有哪些?
Before、After、Around(环绕通知)、Afterreturning(返回通知)、Afterthrowing(异常通知)
什么是切面 Aspect?
多个切面的执行顺序如何控制?
springboot相关
什么是springboot starters?
springboot支持哪些内置容器?
spring boot的核心注解是哪个?
答:核心注解是@springBootApplication,也是程序入口启动类上面的注解,可以把它看成是以下三个注解的集合:
SpringBootConfiguration:定义一个类为@configuration类,实现配置文件的功能。
EnableAutoConfiguration:打开自动配置功能。
ComponentScan:扫描注解,可以查找到包内被注解了的类。
只要在主类上用了这个注解就可以看作是应用了这三个注解。
spring boot除了核心注解还有哪些常用注解?
1、@autowired:自动装配依赖对象
2、@component @service @reposity @controler:让容器能够自动装配bean对象
3、@RestController=@controller+@responseBody注解的结合,表示这是个控制器bean,并且将函数的返回值直接填入HTTP响应体中,而不是view和model,如果需要构建一个xml、Json格式的数据时,用restcontroller比较好,如果要渲染视图,用controller注解比较好。
4、@Scope:定义bean的作用域
5、@Configuration用于声明配置类。
6、@Value(${}):读取配置文件里面的数据内容
spring boot是如何实现自动配置的?原理是什么?
答:核心注解@springbootapllication,其中@enableautoconfiguration是自动装配的关键,根据类路径和自动配置类上的注解进行配置。他给容器中导入自定义的自动配置类,筛选有效的自动配置类,每一个自动配置类结合对应的读取配置文件进行配置。
spring boot常用的三种配置文件?三种配置文件的优先级?
答:application.properties和application.yml、application.yaml进行简单配置。主要使用.yaml配置文件。优先级:properties>yml>yaml。
yaml格式以及它的优势?
答:人类可读的数据序列化语言,配置文件格式更加结构化,大小写敏感,使用空格表示层级关系,更少容易混淆。
优势:配置有序;支持数组;简洁。
springboot常用的读取配置文件的方法有哪些?
1、通过@Value读取简单配置信息
2、使用Environment对象,用@autowired进行自动装配,然后用environment对象获取属性值
3、(常用)用实体类和@Component @ConfigurationProperties注解进行封装,第一个注解给它设定为一个bean,第二个注解加载配置文件,就实现了将配置属性绑定到一个bean中。
spring boot加载配置文件的优先级了解吗?
简单介绍一下得了,其实不完整:命令行参数>Java系统属性>操作系统环境变量>用用程序外的配置文件(properties yaml等)>jar包内的配置文件
为什么要对数据结构进行封装?为什么要进行bean映射?常用的bean映射工具有哪些?
答:将数据结构封装为DO DTO VO主要是为了提高代码的清晰度,可维护性、数据安全性和分离关注点。当持久层、业务逻辑层或表示层数据发生变化时,可以独立修改不会互相影响,通过封装将数据从一种形式转为另一种形式,避免敏感信息的泄露。
为了简化代码,数据安全,使用bean映射工具而不是自己写代码转换是一种更简单可靠的方式。常用的映射工具有:dozer、mapstruct、modelmapper等。
springBoot中的监视器是什么?如何监控系统实际运行情况?
答:监视器是指对应用程序的运行状态、性能指标进行监控,springboot为此提供了一个名为spring-boot-actuator的模块,能够为应用添加生产级的功能,包括健康检查和外部配置。配置完这个起步依赖之后,就可以获得一些开箱即用的功能。
通过actuator提供的端点进行监控和管理。
spring boot为什么要做参数请求校验?如何做参数请求校验?
数据完整性:确保接收到的数据满足预期格式
安全性:防止恶意的输入,SQL注入、脚本注入等
保持数据的一致性:确保数据在存储之前都经过了相同的验证逻辑
如何做参数请求校验?
答: