一、什么是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不要到处拦截,一般用于拦截业务层