Spring AOP常见面试题
一、面试官问:AOP是什么?
与OOP对比,面向切面,传统的OOP开发中的代码逻辑是至上而下的过程中会长生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不会散落在代码的各个地方,造成难以维护,AOP的编程思想就是把业务逻辑和横切的问题进行分离,从而达到解耦的目的,使代码的重用性和开发效率高(目的是重用代码,把公共的代码抽取出来)
二、面试官问:AOP的应用场景有哪些呢?
1、日志记录
2、权限验证
3、效率检查(个人在代码上,喜欢用注解+切面,实现校验,redis分布式锁等功能)
4、事务管理(spring 的事务就是用AOP实现的)
三、面试官问:springAop的底层是怎样实现的?
(这个时候,条件反射地想起这两点)
1、JDK动态代理
2、CGLIB代理
面试官一问:是编译时期进行织入,还是运行期进行织入?
---->运行期,生成字节码,再加载到虚拟机中,JDK是利用反射原理,CGLIB使用了ASM原理。
面试官再问:初始化时期织入还是获取对象时织入?
----》初始化的时候,已经将目标对象进行代理,放入到spring 容器中
面试官再再问:spring AOP 默认使用jdk动态代理还是cglib?
-----》要看条件,如果实现了接口的类,是使用jdk。如果没实现接口,就使用cglib。
(来一个尴尬的笑容,有点忘记了,内心,直接泪目)
四、面试官问:spring AOP 和 AspectJ的关系?
1、两者都是为了实现AOP这个目的,而出现的技术,spring aop 参考 AspectJ编程风格
---》这里有个故事就是,原本spring aop 初期的时候所用的编程风格,让人用起来,很不方便,而且让人看不懂。后来,spring aop 就开始取用了Aspectj的编程风格去进行编程
这里有一个小彩蛋(如果知道,请跳过),搭建一个用上spring,但是不使用xml文件,而且将bean注入到容器中,而且能从容器中拿出来的项目。
第一步骤:加入spring-context依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
第二步骤:加入三个类,一个测试类
@Configuration
@ComponentScan("com.ving")
public class AopConfig {
} //////////////////////////////////////////////// @Component
public class IndexDao { public void query(){
System.out.println("dao----query");
}
} //////////////////////////////////////////////// public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AopConfig.class);
annotationConfigApplicationContext.start();
IndexDao bean = annotationConfigApplicationContext.getBean(IndexDao.class);
bean.query(); }
} //////////////////////////////////////////////// 打印的结果为: 十二月 16, 2019 8:58:38 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6438a396: startup date [Mon Dec 16 20:58:38 CST 2019]; root of context hierarchy
dao----query
我们继续往下看
面试官最后一问:能不能简单说下AOP中的切面、切点、连接点、通知,四者的关系?
aspect 切面
Point cut (如果理解了这个切点的概念,就在应用方面完全是可以的了)表示连接点的集合(类似一个表)
Join point 目标对象中的方法(每一条记录)
weaving 把代理逻辑加入到目标对象上的过程叫做织入
advice 通知类型,请下下图官网说明
下面代码是说明切面,切点,连接点,通知,四者的关系!
/**
*
* 切面
* 一定要给spring 管理
*/
@Component
@Aspect
public class VingAspectJ { /**
* 切点
* 为什么切点要声明在一个方法上?目的是为了将注解写在上面而已
* pointcut是连接点的集合(就是方法的集合)
*/
@Pointcut("execution(* com.ving.dao.*.*(..))")
public void pointCut(){ } /**
* 通知---》配置切点
*/
@After("com.ving.config.VingAspectJ.pointCut()")
public void after(){
System.out.println("after");
} @Before("com.ving.config.VingAspectJ.pointCut()")
public void before(){
System.out.println("before");
}
}
Spring AOP常见面试题的更多相关文章
- 死磕Spring之AOP篇 - Spring AOP常见面试题
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 关于Spring的常见面试题
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方 ...
- (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)
题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...
- 互联网大厂Java面试题集—Spring boot常见面试题(二)
Spring Boot的核心功能与使用优点? 核心功能: 1)Spring Boot项目为独立运行的spring项目,java -jar xx.jar即可运行. 2)内嵌servlet容器(可以选择内 ...
- spring cloud 常见面试题 来理解微服
为什么要谈 这些理论知识呢 理论知识 = 面试时候的谈资 !!! 你只有 进去公司 才有资格 去做一个码农 ok 话不多说 经历如此漫长的互联网发展 以本人的拙见 软件开发 粗略的 分为 ...
- Spring 常见面试题总结 | JavaGuide
首发于 JavaGuide 在线网站:Spring 常见面试题总结 最近在对 JavaGuide 的内容进行重构完善,同步一下最新更新,希望能够帮助你. Spring 基础 什么是 Spring 框架 ...
- SpringMVC常见面试题总结(超详细回答)
SpringMVC常见面试题总结(超详细回答) 1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的 ...
- Vue常见面试题汇总
Vue框架常见面试题 1.active-class是哪个组件的属性?嵌套路由怎么定义? 答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
随机推荐
- Winform界面GridView中XCDataGridViewCheckBoxAllColumn改变触发事件
1.首先利用CurrentCellDirtyStateChanged事件 监测状态改变后判断是否有未提交的更改,若有则提交 private void CurrentCellDirtyStateChan ...
- 许愿墙JQ
<!doctype html> <html> <head> <meta charset="utf-8"> <t ...
- Java虚拟机内存基础、垃圾收集算法及JVM优化
1 JVM 简单结构图 1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放 ...
- python面向对象:组合、封装、property装饰器、多态
一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. ...
- Hadoop_19_MapReduce&&Yarn运行机制
1.YARN的运行机制 1.1.概述: Yarn集群:负责海量数据运算时的资源调度,集群中的角色主要有:ResourceManager.NodeManager Yarn是一个资源调度(作业调度和集群资 ...
- 桌面Ubuntu卡死解决方案
通常情况下,我们用桌面Ubuntu会遇到卡住的的情况,我们一般会进行强制关机处理,但其实还有另一种操作,不用强制关机. 切换到tty模式,执行命令pkill X;start X;就能重新进入桌面,不用 ...
- META-INF/MANIFEST.MF介绍
META-INF文件夹相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序.扩展程序.类加载器和服务.这个文件夹和其中的 MANIFEST.MF文件,在用jar打包时 ...
- Spring管理Hibernate事务
在没有加入Spring来管理Hibernate事务之前,Hibernate对事务的管理的顺序是: 开始事务 提交事务 关闭事务 这样做的原因是Hibernate对事务默认是手动提交,如果不想手动提交, ...
- iOS RAC使用补充
1 延迟执行 [[RACScheduler mainThreadScheduler] afterDelay: schedule:^{ NSLog(@"延迟执行.."); }]; ...
- Centos6系统启动流程
Centos6系统启动流程 一.CentOS 5和6的启动流程 Linux内核:存在于/boot分区,是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制. ...