Spring AOP常见面试题

一、AOP是什么?

与OOP对比,面向切面,传统的OOP开发中的代码逻辑是至上而下的过程中会长生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不会散落在代码的各个地方,造成难以维护,AOP的编程思想就是把业务逻辑和横切的问题进行分离,从而达到解耦的目的,使代码的重用性和开发效率高(目的是重用代码,把公共的代码抽取出来)

二、AOP的应用场景

1、日志记录

2、权限验证

3、效率检查

4、事务管理

三、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.spring[email protected]6438a396: startup date [Mon Dec 16 20:58:38 CST 2019]; root of context hierarchy
dao----query

 

我们继续往下看

五、spring Aop 的应用

aspect 切面

Point cut (如果理解了这个切点的概念,就在应用方面完全是可以的了)表示连接点的集合(类似一个表)

Join point 目标对象中的方法(每一条记录)

weaving 把代理逻辑加入到目标对象上的过程叫做织入

advice 通知类型

下面代码是说明切面,切点,连接点,通知,四者的关系!

/** * * 切面 * 一定要给spring 管理 */@Component@Aspectpublic 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");    }}

  

原文地址:https://www.cnblogs.com/vingLiu/p/12052096.html

时间: 2024-11-06 09:51:46

Spring AOP常见面试题的相关文章

java常见面试题——java笔试题总结

注:本文转载自http://www.cnblogs.com/huajiezh/p/5790928.html,版权归其所有! Java常见面试题总结 一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4.描述一下ArrayList和LinkedList各自实现和区别 5.Java中的队列都有哪些,有什么区别. 6.反射中,Class.forName和cl

redis集群的常见面试题

redis集群的常见面试题 1) 简单说一下你对分布式理解? 答:一个业务分拆多个子业务,部署在不同的服务器上实现相同的业务就是分布式若是一个字节业务点垮了 那么整个项目将无法运行 2) 简单说一下你对集群理解? 为了解决大型网站的访问量大.并发量高.海量数据的问题  和对分布式的问题进行解决的一个方案   将几台服务器集中在一起,实现同一业务,多个处理相同功能的服务器集合.若一台服务器垮了,其它的服务器可以顶上来. 3) 说一下分布式和集群联系和区别 区别:集群是相当于一个存储数据的地方  而

JAVA常见面试题及解答-java开发

JAVA常见面试题及解答 Java的垃圾回收总结  浅谈Java中的内部类 1)transient和volatile是java关键字吗? 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class T { transient int a;  //不需要维持 int b;  //需要维持 } 这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存. volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变.在多

java主线程等待所有子线程执行完毕在执行(常见面试题)

java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功,下面就说一下我能想到的方法,欢迎大家批评指正: 用sleep方法,让主线程睡眠一段时间,当然这个睡眠时间是主观的时间,是我们自己定的,这个方法不推荐,但是在这里还是写一下,毕竟是解决方法 2.使用Thread的join()等待所有

linux系统运维企业常见面试题集合(三)

linux系统运维企业常见面试题集合(三) 01  写一个sed命令,修改/tmp/input.txt文件的内容,要求:(1) 删除所有空行:(2) 一行中,如果包含"11111",则在"11111"前面插入"AAA",在"11111"后面插入"BBB",比如:将内容为0000111112222的一行改为:0000AAA11111BBB2222 [[email protected]~]# cat -n /t

asp.net常见面试题(一)

1.索引器 1 class Player 2 { 3 private int[] arr = new int[100]; 4 public int this[int index] 5 { 6 get { 7 if (index < 10 || index >= 10) 8 { 9 return 0; 10 } 11 else 12 { 13 return arr[index]; 14 } 15 } 16 set { 17 if (!(index < 0 || index >= 10

一些html5和css3的一些常见面试题

最近总结了一些有关于html5和css3的一些常见面试题,希望对正在找工作的你有所帮助. 还有欢迎大家补充~~~ 一.HTML5 CSS3 CSS3有哪些新特性? 1. CSS3实现圆角(border-radius),阴影(box-shadow), 2. 对文字加特效(text-shadow.),线性渐变(gradient),旋转(transform) 3.transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9de

iOS 多线程 自动释放池常见面试题代码

同步:代码依次执行,一个人执行多个任务,也是依次执行.一个人在同一时间只执行一个任务 异步:可以同时执行多个任务 进程:指在系统中运行的应用程序,每个进程都是独立的,都有独立的且安全的运行空间 线程:一个进程可以有多个线程,但只有一个主线程.进程的任务都是在线程里面完成的. 进程,线程与多线程之间的关系? 进程=公司     线程 = 员工    多线程 = 老板 多线程可以解决程序阻塞问题,也可以提高程序的执行效率 自动释放池常见面试题代码 p.p1 { margin: 0.0px 0.0px

JDBC常见面试题集锦

什么是JDBC,在什么时候会用到它? JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库.JDBC接口及相关类在java.sql包和javax.sql包里.我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果. JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加简单. 有哪些不同类型的JDBC驱动? 有四类JDBC驱动.和数据库进行交互的Java程序分成两个部分,一部分是JDB