小编最近学习spring Aop,对一下基础做了一个总结,以前写的这篇文章《SpringBoot——AOP处理请求日志》是对日志处理的一个实现。读者们可以先了解一下。
【AOP】
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子。
【基本概念】
1、Corss Cutting Concern:一种独立服务,它遍布在系统的处理流程之中
2、Aspect(切面):对横切性关注点的模块化,通常是一个类,里面可以定义切入点和通知
3、Advice(通知):对横切性关注点的实现,AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
4、Pointcut(切入点):定义了那些Advice应用到那些JoinPoint上,对Spring来说是方法调用
5、Weave:将Advice应用到Target Object上的过程叫织入,Spring支持的是动态织入
6、Target Object:Advice被应用的对象
7、Proxy:Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理,前者基于接口,后者基于子类,离不开Spring的IOC容器,代理的生成,管理及其依赖关系都是由IOC容器负责
8、Introduction:可以动态的为类添加方法
9、JoinPoint:Advice在应用程序上执行的点或时机,Spring只支持方法的JoinPoint,这个点也可以使属性修改,如:Aspecj可以支持
【基于注解的AOP配置方式】
1.启用@AsjectJ支持,在applicationContext.xml中配置下面一句:
<aop:aspectj-autoproxy />
2.通知类型介绍
(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
3、代码实现
一、UserManager.java
public interface UserManager {
public void addUser(String userName, String password);
public void delUser(int id);
public String findUserById(int userId);
public void modefyUser(int userId, String username, String password);
}
二、UserManagerImp
public class UserManagerImp implements UserManager {
@Override
public void addUser(String userName, String password) {
System.out.println("addUser");
}
@Override
public void delUser(int id) {
System.out.println("delUser");
}
@Override
public String findUserById(int userId) {
System.out.println("findUserById");
return "张三";
}
@Override
public void modefyUser(int userId, String username, String password) {
System.out.println("modefyUser");
}
}
三、Sercurity.java
(1)将横切性关注点模块化,建立SecurityHandler.java
(2)采用注解指定SecurityHandler为Aspect
(3)采用注解定义Advice和Pointcut
(4)applicationContext-Annotation.xml中配置启动AspectJ对Annotation的支持,并且将目标类和Aspect类配置到IOC容器中
(5)开发客户端
【基于配置文件方式】
配置文件中的内容发生了改变
【AOP对表达式的支持】
【将客户调用信息传递到Advice中】
【AOP JDK动态代理和CGLIB代理的差别】
好了,小编今天的博客就先写到这里了,以后有机会继续补充关于Spring AOP的内容。