SpringBoot面经

2019-03-14  本文已影响0人  Jocelyn_b0e1

1. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

@ComponentScan:Spring组件扫描。

2. 如何在 Spring Boot 启动的时候运行一些特定的代码?

可以实现ApplicationRunner 接口,run方法。

3. SpringBoot 实现热部署有哪几种方式?

主要有两种方式:

Spring Loaded
Spring-boot-devtools

4. Spring Boot 可以兼容老 Spring 项目吗,如何做?

可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。

5. 保护 Spring Boot 应用有哪些方法?

  1. 在生产中使用HTTPS。
  2. 使用Snyk检查你的依赖关系。
  3. 升级到最新版本。
  4. 启用CSRF(Cross-Site Request Forgery ,跨站点请求伪造)保护。
  5. 使用内容安全策略(contentSecurityPolicy)防止XSS攻击。http.headers()
    .contentSecurityPolicy(......);
  6. 使用OpenID Connect进行身份验证(这个不太懂)
  7. 管理密码?使用密码哈希!
  8. 安全地存储秘密

6. 阻塞与非阻塞,同步与异步

  1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
  2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)
  3. 阻塞, 就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
  4. 非阻塞, 就是调用我(函数),我(函数)立即返回,通过select通知调用者

7. Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?

  1. 配置变更
  2. JDK 版本升级
  3. 第三方类库升级
    1).Spring Framework 5+
    2).Tomcat 8.5+
    3).Flyway 5+
    4).Hibernate 5.2+
    5).Thymeleaf 3+
  1. 响应式 Spring 编程支持:2.x 通过启动器和自动配置全面支持 Spring 的响应式编程,响应式编程是完全异步和非阻塞的,它是基于事件驱动模型,而不是传统的线程模型。
  2. HTTP/2 支持
  3. 配置属性绑定
  4. 更多改进与加强…

8. JPA 和 Hibernate 有哪些区别?

1.JPA 是一个规范或者接口
2.Hibernate 是 JPA 的一个实现
总的来说,JPA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA。

9. Ioc:Inversion of Control,“控制反转”(一种设计思想)https://www.cnblogs.com/xdp-gacl/p/4249939.html

1)“控制”:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
2)“反转”:传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

DI:依赖注入

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

AOP(Aspect Oriented Programming):面向切面编程

可以说是OOP(Object Oriented Programming)的补充和完善,OOP允许开发者定义纵向的关系,但并不适合定义横向的关系。比如日志功能往往横向遍布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

AOP中常用概念:
1)切面(Aspect):一个关注点的模块化,基于@Aspect注解的方式来实现。
2)连接点(Joinpoint):在Spring AOP中,一个连接点总是表示一个方法的执行。
3)通知(Advice):在切面的某个特定的连接点上执行的动作。其中包括了 “around”、 “before” 和“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。
4)切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

/**
*切入点表达式的格式:
*execution([可见性] 返回类型 [声明类型].方法名(参数) [异常])
**/
//e.g. 包名切面:
@Pointcut("execution(public * com.app.controller.*.*(..))")

5)引入(Introduction):
用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type declaration))。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用引入来使一个bean实现IsModified接口,以便简化缓存机制。
6)目标对象(Target Object):
被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。
7)AOP代理(AOP Proxy):
AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
8)织入(Weaving):
把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

上一篇下一篇

猜你喜欢

热点阅读