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 应用有哪些方法?
- 在生产中使用HTTPS。
- 使用Snyk检查你的依赖关系。
- 升级到最新版本。
- 启用CSRF(Cross-Site Request Forgery ,跨站点请求伪造)保护。
- 使用内容安全策略(contentSecurityPolicy)防止XSS攻击。http.headers()
.contentSecurityPolicy(......); - 使用OpenID Connect进行身份验证(这个不太懂)
- 管理密码?使用密码哈希!
- 安全地存储秘密
6. 阻塞与非阻塞,同步与异步
- 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
- 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)
- 阻塞, 就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
- 非阻塞, 就是调用我(函数),我(函数)立即返回,通过select通知调用者
7. Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
- 配置变更
- JDK 版本升级
- 第三方类库升级
1).Spring Framework 5+
2).Tomcat 8.5+
3).Flyway 5+
4).Hibernate 5.2+
5).Thymeleaf 3+
- 响应式 Spring 编程支持:2.x 通过启动器和自动配置全面支持 Spring 的响应式编程,响应式编程是完全异步和非阻塞的,它是基于事件驱动模型,而不是传统的线程模型。
- HTTP/2 支持
- 配置属性绑定
- 更多改进与加强…
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框架一样,在运行时完成织入。
网友评论