Spring、SpringBoot相关

核心概念

是什么?

spring  spring boot 都是轻量级开发框架,为了简化Java开发,整合了很多默认配置,能够很快起步。

Spring 框架中都用到了哪些设计模式?
工厂:beanfactory
单例:bean默认为单例模式
代理:AOP切面编程,使用了动态代理
模板:解决代码重复问题
spring包含哪些模块?
core container(核心容器):包括beans、core、context 
AOP:面向切面编程,解决横切关注点
Aspects:AOP思想实现
Data Access(数据访问集成 :JDBC、JMS、 事务
Web:包括Web MVC、Websocket
Test:为Spring组件提供测试支持

IOC

什么是Spring IOC 容器?有什么作用 ?优点是什么?实现机制?
定义:对对象的控制权从程序代码转移到了外部容器。IOC容器为应用程序提供了一个环境,在这个环境中,对象的创建、配置和管理都是由容器自动处理的。而DI是实现这种管理的具体手段,它确保组件之间的依赖关系得到正确的维护和满足。
作用:管理对象的创建、生命周期和依赖的维护;
优点:解耦;更容易测试;集中式的配置管理。
实现机制:工厂模式和反射机制。 f=(Fruit)Class.forName(ClassName).newInstance();
BeanFactory ApplicationContext有什么区别?

答:FactoryBean和beanfactory不是一个东西,FactoryBean是创建实例对象的方式,造出来的对象是getobject()中的对象。

而BeanFactory ApplicationContext Spring 的两大核心接口,都可以当做 Spring 的容器。其中
ApplicationContext BeanFactory的子接口。ApplicationContext实现的顶层接口 BeanFactory。
BeanFactory属于延迟加载,用到某个bean的时候才加载,ApplicationContext是启动容器的时候把所有bean都加载了。
ApplicationContext 接口作为 BeanFactory 的派生,除了提供 BeanFactory 所具 有的功能外,还提供了更完整的框架功能,总的来说是更高级的容器,使用也更多。
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
答:切面是定义的切入点与通知之间的关系,即说明了对于哪些切入点要执行哪些通知。工作重心在于如何将增强代码织入目标对象的连接点上。
多个切面的执行顺序如何控制?
答:这种情况是指,连接点可能对应了多个切面,有多个增强需要实现。可以使用ordered控制执行顺序。在切面类上使用@order注解,@order(3),值越小,优先级越高。

springboot相关

简化开发、快速启动、内置servelet容器、广泛的扩展性、自动配置、起步依赖。
什么是springboot starters?
答:是一系列依赖关系的集合,因为starter的存在,项目之间的依赖关系对我们来说更简单了。比如用spring开发一个web项目时,需要配置spring mvc、tomcat等内容,需要我们一个一个手动添加配置,而spring starter之后我们只需要配置一个spring-boot-web-starter一个依赖即可,这个依赖中就已经配置好了web应用需要的所有依赖的库和包。
springboot支持哪些内置容器?
答:支持tomcat、jetty、undertow。默认配置的是tomcat,如果想修改默认配置,使用jetty容器,可以这样使用:
在web starter中用exclude排除tomcat的依赖,再用dependency加入对jetty的依赖坐标。

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注入、脚本注入等

保持数据的一致性:确保数据在存储之前都经过了相同的验证逻辑

如何做参数请求校验?

答:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值