1.什么是AOP
AOP:面向切面编程。简单说就是把一些业务逻辑中相同的代码抽取到一个独立的模块中,让业务代码清晰。
AOP的核心就是动态代理,如果是实现了接口的话会使用JDK动态代理,否则使用CGLIB代理,主要应用处理一切具有横切性质的系统级服务,如日志收集,事务管理,安全检查、缓存,对象池管理等。
AOP那些核心观念:
- 切面:类是对物体特征的抽象,切面就是横切关注点的抽象
- 连接点:在Spring中指的就是拦截到的方法,实际连接点还可以是字段或者构造器。
- 切点:对连接点进行拦截的定位。
- 通知:所谓通知就是指的是拦截到连接点后要执行的代码,也可以叫做增强。
- 目标对象:代理的目标对象
- 织入:织入就是将增强添加到目标类的具体连接点上的过程。
- 引介:引介是一种特殊的增强,可以动态的为类增加一些属性和方法
2.AOP的那些环绕方式
- 前置通知(@Before)
- 返回通知(@AfterReturning)
- 异常通知(@AfterThrowing)
- 后置通知(@After)
- 环绕通知(@Around)
多个切面的情况下,可以通过@Order指的先后顺序,数字越小,优先级越高。
3.说说JDK动态代理和CGLIB代理
Spring的AOP是通过动态代理来实现的,动态代理主要分为Jdk动态代理和CGLIB动态代理。
JDK动态代理:
- Interface:对于jdk动态代理,目标类需要实现一个Interface
- IncocationHandler:是一个接口,可以通过实现这个接口,定义横切逻辑,在通过反射机制调用目标类的代码,在次过程,可能包装逻辑,对目标方法进行前置后置处理。
- Poxy:Proxy利用InvocationHandler动态创建一个符合目标类实现的接口实例,生成目标类的代理对象
Cglib动态代理
- 使用JDk创建代理有一大限制,他只能为接口创建代理实例,而Cglib动态代理就没有这个限制。
- Cglib动态代理是使用字节码处理框架ASm,其原理是通过字节码为类创建一个子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
- Cglib创建的动态代理对象性能比Jdk创建的动态代理对象性能高不少,但是Cglib在创健代理对象时候所花费的时间却比Jdk多的多,所以对于单例的对象因为无需频繁创建对象,使用Cglib合适。反之Jdk动态代理合适
4.Spring Aop的特点
Spring Aop 属于运行时增强,具有一下特点
- 基于动态代理实现,默认使用接口的用Jdk提供的动态代理
- Spring AOP需要依赖IOC容器来管理,并且只能用于Spring容器,使用纯Java代码实现
- Spring AOP 致力于解决企业家开发中最普遍的AOP(方法织入)
5.Spring 事务的种类
Spring 支持编程式事务管理和事务管理两种方式。
1.编程式事务
编程式事务管理使用TransactionTemplate,需要显示执行事务
2.声明式事务
声明式事务是建立在AOP上的,本质是通过AOP功能对方法前后进行拦截,优点是不需要再业务逻辑代码中掺杂事务管理的代码,只需要在配置文件中座相关的事务规则声明或者通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中去,减少业务代码污染,不足的地方就是最细颗粒度只能作用到方法级别,无法像编程式事务那样作用到代码块级别。
6.声明式事务那些情况会失效
7.Spring MVC的核心组件
- DispatcherServlt:前置控制器,是整个流程控制的核心,控制其他组件的执行,进行统一调度。降低组件之间的耦合性。
- Handler:处理器,完成具体的业务逻辑
- HandlerMapping: DispatcherServlet接受请求后,通过HandlerMapping将不同的请求映射到不同的Handler
- HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。
- HandlerExecutionChain:处理器执行链,包括两部分内容:Handler 和 HandlerInterceptor(系统会有一个默认的HandlerInterceptor,如果需要额外设置拦截,可以添加拦截器)。
- HandlerAdapter:处理器适配器,Handler 执行业务方法之前,需要进行一系列的操作,包括表单数据的验证、数据类型的转换、将表单数据封装到 JavaBean 等,这些操作都是由 HandlerApater 来完成,开发者只需将注意力集中业务逻辑的处理上,DispatcherServlet 通过 HandlerAdapter 执行不同的 Handler。
- ModelAndView:装载了模型数据和视图信息,作为 Handler 的处理结果,返回给 DispatcherServlet
- ViewResolver:视图解析器,DispatcheServlet 通过它将逻辑视图解析为物理视图,最终将渲染结果响应给客户端
8.# Spring MVC的工作流程
8.SpringMVC Restful的风格接口的流程
我们都知道 Restful 接口,响应格式是 json,这就用到了一个常用注解**:@ResponseBody**
9.SpringBoot的优点
- 可以快速创建独立的Spring应用程序
- 内嵌了如Tomcat,jetty和Undertow这样的容器,可以直接跑起来
- Springboot无需在向Spring一样使用一堆繁琐的xml文件进行配置
- SpringBoot 可以自动配置Spring,Springboot将原有的xml配置改为java配置,将bean注入更改为使用注解方式,并且将多个xml、propreties配置浓缩为一个Application.xml配置文件中
- Spring boot 提供了一些现有的功能,如表单数据验证,以及三方功能
- 可以快速整合常用的依赖开发库,提供了POM可以简化Maven的配置,当我们引入核心依赖时候,Springboot会自动引入其他的依赖。
10.Springboot 自动配置原理
Springboot开启自动配置原理的注解是@EnableAutoConfiguration,启动类上的注解是SpringbootApplication,是一个复合注解,包含了EnableAutoConfiguration
- EnableAutoConfiguration 只是一个简单的注解,自动装配核心功能的实现实际是通过
AutoConfigurationImportSelector 类
11. Springboot 启动原理
- 推断应用是普通项目还是Web项目
- 查找bong加载所有可用初始化器,设置到initializers属性中
- 找出所有的应用程序监听器,设置到listeners属性中
- 推断并设置main方法定义类,找到运行的主类。
12.对 SpringCloud 了解多少?
什么是微服务
- 2014 年Martin Fowler 提出的一种新的架构形式。微服务架构是一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间相互协调,互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务之间采用轻量级的通信机制(如 HTTP 或 Dubbo)互相协作,每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具(如 Maven)对其进行构建。
- 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,拥有自己独立的数据库。
微服务架构主要要解决哪些问题?
3. 服务很多,客户端怎么访问,如何提供对外网关?
4. 这么多服务,服务之间如何通信? HTTP 还是 RPC?
5. 这么多服务,如何治理? 服务的注册和发现。
6. 服务挂了怎么办?熔断机制
有哪些主流微服务框架?
- Spring Cloud Netflix
- Spring Cloud Alibaba
- SpringBoot + Dubbo + ZooKeeper