面试——aop

一、什么是AOP

AOP:大体可以理解为面向切面编程,详解可以百度:https://baike.baidu.com/item/AOP/1332219?fr=aladdin

二、AOP是基于什么实现的

AOP是基于动态代理实现的,而动态代理可以理解为动态执行方法,动态加载类。

三、AOP在ssm框架中是如何执行的,怎么使用的反射机制

我在我的项目业务层增加了一个空指针异常,来查看ssm框架如何调用




从异常抛出的顺序来看,可以得到ssm框架的运行顺序

1.请求发送过来后,服务器线程池发配一个线程处理请求

2.过滤器拦截请求对请求进行判断和过滤

3.经过过滤器的请求经过来到DispatherServlet主控制器,并根据域名找到应当执行的控制器,并用反射来执行控制器

4.控制器调用com.sun.proxy.$Proxy——也即是动态代理(aop底层就是用动态代理和反射实现的)

5.aop通过反射调用业务层方法,发现了空指针异常。

四、AOP内部执行顺序以及注解

概念:

1.目标方法:被AOP拦截的业务方法,称为目标方法。

2.注解:@Before,@After,@Afterthrowing,@AfterReturning,@Around

@Before注解:在业务方法之前执行,也就是说在业务层之前执行
@After注解:在业务方法之后执行,也就是在业务层之后执行

案例

aop:


业务层:


启动tomcat后执行顺序为:

Hello world——>login——>After

@AfterReturning与@AfterThrowing

这两个注解顾名思义,配合try-catch执行,不过try-catch被aop所封装

案例


执行顺序:


(1)如果没有异常,则控制器调用aop,先执行@Before,之后调用业务方法,再调用AfterReturning,最终调用After。

显示顺序:hello world——>login——>After——>AfterReturning

显示顺序虽然after是先于AfterReturning之前调用,这是spring做了一些机制处理,将After再AfterReturning之前调用,如果想要按照正常try-catch顺序进行,要使用@Around注解

(2)有异常,则顺序为:@Before——>业务层——>@AfterThrowing——>@After

显示顺序:hello world——>login——>AfterThrowing——>After

@Around注解(环绕通知)

环绕通知:再业务方法前后调用

执行顺序



其中return val返回值会将值赋给Contrller中的User对象,然后将Controller返回给浏览器。

我们可以再return val这里做手脚,如上上图,抛出异常,或者返回一个别的值,干预业务方法的返回结果。

事务控制:aop的延申适用,对jdbc的事务处理进行封装

要想要@Transactional生效,需要配置事务管理器:TransactionalManager

五、aop的切入点

bean与within:

注意:aop不要到处拦截,一般用于拦截业务层

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章