面向切面编程AOP

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

AOP
Aspect Oriented Programming 面向切面编程
不是技术而是一种思想即将分散在各个功能模块方法中的共同的功能代码抽取出来通过动态代理等技术手段将其注入到功能代码中被抽取出来的部分就是切面
例如
Filter
service时需要提交事务
Dao时需要创建连接关闭连接
通用功能日志处理权限检查
AOP与OOP的区别
OOP面向对象编程AOP面向切面编程
OOP是纵向的抽取AOP是横向的抽取
OOP是面向名词领域抽取出来的是类AOP面向动词领域抽取出来的是切面功能代码
AOP不能取代OOP是对OOP的一种补充
AOP的相关概念
增强advice通知新增的额外的功能例如事务管理日志处理权限验证在AOP中一共有五种增强分别是前置后置环绕返回值异常
连接点JoinPoint程序执行的某个特定的位置例如方法调用前调用后
切点PointcutAOP通过切点来定位到特定的连接点
引介introduction):特殊的增强为类增加一些属性和方法
织入weaving把增强添加到目标类的具体连接点的过程一共有三种方式
编译器织入Aspect
类加载织入
动态代码织入动态代理
目标对象target被代理的对象
代理对象Proxy植入增强后的对象
切面aspect切入点 + 增强 = 切面
AspectJ
AspectJ是目前最流行的AOP框架Spring2.0的版本就已经集成了AspectJ因此我们可以直接使用AspectJ运行Annotation和xml两种配置

使用AspectJ
导包

org.springframework
spring-aspects
5.2.4.RELEASE

创建一个切面类
@Component
@Aspect
public class MyAspect {

	}

为切面类增加增强
@Before(value = “execution(* com.oracle.service..(…))”)
public void before() {
System.out.println(“----------------前置增强被调用”);
}
在spring的配置文件中扫描包并且让@Aspect生效
aop:aspectj-autoproxy</aop:aspectj-autoproxy>
<context:component-scan base-package=“com.oracle.service,com.oracle.aop”></context:component-scan>
测试
ApplicationContext factory = new ClassPathXmlApplicationContext(“applicationContext_aop.xml”);
BookService service = factory.getBean(BookService.class);
service.save(“兄弟”);
使用AspectJ开发的思路
切面 = 增强 + 切入点
只要有切面那么Spring就会自动为我们创建代理对象

需要做的事情
1.定义一个类这个类是一个切面类@Aspect注解
2.在切面类中定义多个增强每个增强都是一个方法
3.给每个增强配置切入点表达式

FIlter
1.定义一个Filter类
2.在Filter类中定义doFilter方法
3.配置Filter的url_pattern;

AspectJ的五种通知
@Before前置
@After:后置
@AfterReturning返回值
@AfterThrowing异常
@Around环绕
如果有一个切入点使用了多次可以使用@Pointcut来手动定义一个
@Pointcut(value = “execution(* com.oracle.service..(…))”)
public void myPointCut() {};
@Before(“myPointCut()”)
public void before(JoinPoint join) {
System.out.println(“----------------前置增强被调用” + join.getSignature().getDeclaringType()+" ."+join.getSignature().getName());
}
如果定义了多个同类型的增强可以使用@Order来定义执行的顺序

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6