Spring学习理解之-Aop

Spring学习理解之-Aop

上一篇文章介绍了Spring的后置处理器,而SpringAop就是基于Spring后置处理器实现的。我们一起学习一下SpringAop;

什么是Aop?SpringAop是什么?

1、什么是Aop?

在介绍Aop之前首先介绍一下代理模式,代理模式是代理目标类与调用类交互,例如当一个类A,在执行过程不能直接被类B调用,但是A类可以被C类进行调用,C可以被B类调用,这时我们可以让B类C类,C类调用A类,这样B类就可以间接的调用A类,在这个过程中C类就是A类的代理类,这种使用模式中叫做代理模式。
代理类分为静态代理和动态代理,两个唯一区别就是
静态代理在编码阶段手动实现代理类,在被调用的地方添加代理类代码,缺点就是代码侵入性很强,当目标类很多时需要维护的代码量太大;
动态代理是在程序运行过程通过反射机制,创建代理类对象,并动态指定要代理的目标类(静态代理中代理目标是写死的),不需要手动创建类的java文件。动态代理的常用实现方式有两种:JDK动态代理、Cglib动态代理。JDK动态代理通过实现InvocationHandler.invoke接口(调用处理器),invoke方法表示代理对象要执行的功能代码,实现invoke方法,主要逻辑(1)调用目标类的方法(2)功能增强,在调用目标方法前后进行增强。

MyHandler implements InvocationHandler{
		private Object target = null;
		public MyHandler(Object object){
				this.target = target;
		}
		@Override
		public Object invoke(Object obj,Method method,Object[] args){
					Object res = null;
					//执行目标方法
					method.invoke(target,args);
					/ /进行增强
					 
			}
}
使用动态代理:
public static void main(String[] strs){
		//创建目标类
		A a = new A();
		InvocationHandler handler = new MyHandler(a);
		A proxy = (A)Proxy.newProxyInstance(a.getClass().getClassloader(),a.getClass().getInterfaces(),handler);
		proxy.方法();
}
public invoke(Object proxy,Method method,Object[] args);
proxy参数表示jdk创建的代理对象,无需赋值;
method表示目标类中要执行的方法,jdk提供的method的对象
args表示目标类执行的方法的参数。

了解上面的静态代理和动态代理,接着继续理解一下什么是AOP?
AOP(Aspect Orient Programming)是面向切面编程,作为面向对象编程的补充,是通过AOP实现,在不改变原有代码的基础上,对对象进行增强。Aop主要用于解决系统中不同模块之间存在交叉关注点问题,通过横切形式统一处理,如:事务的管理、日志的打印、安全检查、对象池管理等。
使用AspectJ实现AOP.AspectJ是一个基于java实现的AOP框架。主要包含两部分:一部分是定义aop编程的语法规范,一部分是工具部分,编译、调试工具等;
aop实现可分为:静态aop实现和动态aop实现;
静态AOP是在编译阶段对程序进行修改,即实现对目标类的增强,生成静态的AOP代理类,以AspectJ为代表。
动态AOP是在运行阶段生成AOP代理,以SpringAOP为代表。

2、SpringAop是什么?

首先SpringAop也是面向切面编程,是面向对象的一种补充,SpringAop的核心动态代理,实现方式有两种,JDK动态代理和cglib动态代理。JDK动态代理通过反射来接收代理类,代理的类必须实现接口,核心是InvocationHandler和Proxy类;cglib动态代理是一般没有实现接口的类,cglib是一个代码生成类库,可以在运行时动态生成某个类的子类,所以cglib是通过继承的方式实现动态代理,因此如果一类被final修饰时,无法使用cglib实现动态代理。
SpringAop包括:
Advisor:包含通知(拦截器),Spring内部使用的AOP定义顶级接口,还需要一个aop适用判断的过滤器,考虑到通用性,过滤规则由其子接口定义,例如IntroductionAdvisor和PointcutAdvisor,过滤器用于判断bean是否需要被代理;
Pointcut:切点,属于过滤器的一种实现,匹配过滤那些方法需要被切面处理,包含ClassFilter和一个MethodMatcher,使用PointcutAdvisor定义的需要。
ClassFilter:过滤筛选合适的类,有些类不需要被处理
MethodMatcher:方法匹配,用与过滤那些方法需要是使用AOP.
例如:使用Aspectj简介配置Advisor,具体代码如下:

@Aspect
@Component
public class AopConfig{
	 @Pointcut("execution(* cn.com.Aop.service.*.*(..))")
	 public void pointcut(){
	 }
	 @Around("pointcut()")
	 public Object around(ProceedingJoinPoint  joinPoin){
	 		Object obj = null;
	 		try{
	 				obj = joinPoin.proceed();
	 		}catch(Throwable throwable){
	 		}
	 		return obj;
	 }
}

总结:SpringAOP在实际开发中使用较多,其基本原理就是在不改变原有类对象的代码逻辑,对其进行增强;可以通过静态代理和动态代理实现,工作中最常用动态代理实现,通过注解形式实现对一系列逻辑的统一增强,实现解耦、减少代码维护成本和复杂度。主要学习AOP的设计思路,用几行代码可以给一批类添加样的功能,事半功倍。提醒自己,坚持坚持再坚持。。。。。。一定要专注思考,虽然写的不好,一定要多练习写,才能写好,望各位大佬们不吝指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强1223

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值