一、面试官问: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常见面试题的更多相关文章

  1. 死磕Spring之AOP篇 - Spring AOP常见面试题

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  2. 关于Spring的常见面试题

    1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方 ...

  3. (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)

    题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...

  4. 互联网大厂Java面试题集—Spring boot常见面试题(二)

    Spring Boot的核心功能与使用优点? 核心功能: 1)Spring Boot项目为独立运行的spring项目,java -jar xx.jar即可运行. 2)内嵌servlet容器(可以选择内 ...

  5. spring cloud 常见面试题 来理解微服

    为什么要谈 这些理论知识呢   理论知识 = 面试时候的谈资 !!!   你只有 进去公司 才有资格 去做一个码农 ok 话不多说   经历如此漫长的互联网发展  以本人的拙见 软件开发 粗略的 分为 ...

  6. Spring 常见面试题总结 | JavaGuide

    首发于 JavaGuide 在线网站:Spring 常见面试题总结 最近在对 JavaGuide 的内容进行重构完善,同步一下最新更新,希望能够帮助你. Spring 基础 什么是 Spring 框架 ...

  7. SpringMVC常见面试题总结(超详细回答)

    SpringMVC常见面试题总结(超详细回答) 1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的 ...

  8. Vue常见面试题汇总

    Vue框架常见面试题   1.active-class是哪个组件的属性?嵌套路由怎么定义? 答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么 ...

  9. 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...

随机推荐

  1. python selenium1 模拟点击 测试对象 58同城验证码

    #!/usr/bin/python# -*- coding: UTF-8 -*-# @Time : 2019/12/5 17:30# @Author : shenghao/10347899@qq.co ...

  2. 微信小程序上传图片更新图像

    解决思路: 1. 调用wx.chooseImage 选择图片 2.wx.uploadFile 上传图片 3.调用后台接口进行修改操作 修改原来的头像 wx.chooseImage({ success: ...

  3. 5.API详解

    Dao 中需要通过 SqlSession 对象来操作 DB.而 SqlSession 对象的创建, 需要其工厂对象 SqlSessionFactory.SqlSessionFactory 对象, 需要 ...

  4. 针对nginx应用场景的配置 知识整理

    本文为转载,原文链接 前言 原本想写整理一篇针对nginx应用场景的相应配置,但发现已经有人整理了,而且写得非常不错,特意转过来 概论 Nginx 是一款面向性能设计的 HTTP 服务器,能反向代理 ...

  5. cent os 7.0 出现的问题解决方法

    https://www.jb51.net/article/34012.htm       python重编译,并进行安装 https://www.jb51.net/os/RedHat/211444.h ...

  6. 【坑】Java中遍历递归删除List元素

    运行环境 idea 2017.1.1 需求背景 需要做一个后台,可以编辑资源列表用于权限管理 资源列表中可以有父子关系,假设根节点为0,以下以(父节点id,子节点id)表示 当编辑某个资源时,需要带出 ...

  7. elasticsearch 数据备份

    ES数据备份找了一些方法,发现elasticdump 这个工具不错 elasticdump --input=http://192.168.0.92:9200/hs2840 --output ./hs2 ...

  8. HTML5学习:缩略图

    HTML代码 <div> <img src="img/pic.png" alt="This is a pic" /> </div& ...

  9. 前端基础(六):Bootstrap框架

    Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...

  10. Linux学习笔记(五)Linux常用命令:压缩命令

    Linux中最常见的5中压缩格式: zip gz bz2 tar.gz tar.bz2 一..zip压缩命令 压缩文件 zip [压缩文件名] [源文件] 例如: zip zijeak.zip zij ...