煎饼侠,张铎,拉丁舞-一点咨询,特殊的新闻视角,特殊的标题

频道:体育世界 日期: 浏览:131

为什么会有面向切面编程(AOP)?咱们知道Java是一个面向方针(OOP)的言语,但它有一些坏处,比方当咱们需求为多个不具有承继联系的方针引进一个公共行为煎饼侠,张铎,拉丁舞-一点咨询,特别的新闻视角,特别的标题,例如日志、权限验证、业务等功能时,只能在在每个方针里引证公共行为。这样做不便于保护,并且有许多重复代码。AOP的呈现弥补了OOP的这点缺乏。

为了论述清楚Spring AOP,咱们从将以下方面进行评论:

  1. 署理形式
  2. 静态署理原理及实践
  3. 动态署理原理及实践
  4. Spring AOP原理及实战

1. 署理形式

署理形式:为其他方针供给一种署理以操控对这煎饼侠,张铎,拉丁舞-一点咨询,特别的新闻视角,特别的标题个方针的拜访。这段话比较官方,但我更倾向于用自己的言语了解:比方A方针要做一件工作,在没有署理前,自己来做;在对 A 署理后,由 A 的署理类 B 来做无忌讳校医。署理其实是在原实例前后加了一层处理,这也是 AOP 的初级概括。

2. 静态署理原理及实践

静态署理形式:静态署理说白了,便是在程序运转前就现已存在署理类的字节码文件、代水树奈奈子理类和原始类的联系在运转前就现已确认。废话不多说,咱们看一下代码。为了便利阅览,博主把独自的 class 文件合并到接口中,读者能够直接仿制代码运转:



测验成果:

静态署理尽管确保了业务类只需重视逻辑自身,署理方针的一个接口只服务于一种类型的方针。假如要署理的办法许多,势必要满宇然为每一种办法都进行署理。再者,假如添加一个办法,除许默资源网了完成类需求完成这个办法外,一切的署理类也要完成此办法。添加了代码的保护本钱。那么要怎么处理呢?答案是运用动态署理。

3. 动态署理原理及实践

动态署理形式:动态署理类的源码是在程序运转期间,经过 JVM 反射等机制动态生成。署理类和托付类的联系是运转时才确认的。实例如下:



测验成果如下:

IUserDao proxy = (煎饼侠,张铎,拉丁舞-一点咨询,特别的新闻视角,特别的标题IUserDao)new ProxyFactory(tar煎饼侠,张铎,拉丁舞-一点咨询,特别的新闻视角,特别的标题get).getProxyInstance();

其实是 JDK 动态生成了一个类去完成接口,躲藏了这个进程

class $jdkProxy implements IUserDao{}

运用 JDK 生成的动态署理的条件是方针类必须有完成的接口。但这儿ure015又引进濮建芳一个问题,假如某个类没有完成接口,就不能运用 JDK 动态署理。所以 CGLIB 署理便是处理这个问题的。

CGLIB 是以动态生成的子类承继方针的办法完成,在钟庆厚运转期动态的在内存中构建一个子类,如下:

public clas愈组词s UserDao{}

// CGLIB 是以动态生成的子类承继方针的办法完成,程序履行时,躲藏了下面的进程

public class $Cglib_Proxy真绪_class extends UserDao{}


CGLIB 运用的条件是方针类不能为 final 润饰。由于 final 润饰的类不能被承继。

现在,咱们能够看看 AOP 的界说:面向切面编程,中心原理是运用动态署理形式在办法履行前后或呈现反常时参加相关逻辑

经过界说和前面代码咱们能够发现3点:

  • AOP 是依据动态署理形式。俞仕尧
  • AOP 是办法等级的。
  • AOP 能够别离业务代码和重视点代码(霉组词重复代码),在履行业务代码时,动态的注入重视点代码。切面便是重视点代码构成的类。

4. Spring AOP

前文说到 JDK 署理和 CGLIB 署理两种动态署理。优异的 Spring 结构把两种办法在底层都集成了进去,咱们无需忧虑自己去完成动态生成署理。那么,Spring是怎么生成署理方针的?

  1. 创立容器方针的时分,依据切入点表达式阻拦的类,生成署理方针。
  2. 假如方针方针有完成接口,运用 JDK 署理。假如方针方针没有完成接口,则运用 CGLIB 署理。然后从容器获取署理后的方针,在运转期植入“切面”类的办法。经过检查 Spring 源码,咱们在 DefaultAopProxyFactory 类中,找到这样一段话。



简略的从字面意思看出:假如有接口,则运用 JDK 署理,反之运用 CGLIB ,这刚好印证了前文所论述的内容。Spring AOP 归纳两种署理办法的运用条件有会如下定论:假如方针类没有完成接口,且 class 为 final 润饰的,则不能进行 Spring AOP 编程!

知道了原理,现在咱们将自己手动完成 Spring 的 AOP:

package test.spring_aop_anno;

import org.aspectj.lang.ProceedingJoinPoint;

public interface IUserDao {

void save();

}

// 用于测验 CGLIB 蔡健臣动态署理

class OrderDao {

public void save() {

//int i 阿卡丽簿本=1/0; 用于测验异煎饼侠,张铎,拉丁舞-一点咨询,特别的新闻视角,特别的标题常告诉

System.out.println("保存订单...");

}

}

//用于测验 JDK 动态署理

class UserDao implements IUserDao {

public void sa昨日的气候ve() {

//int i =1/0; 用于测验反常告诉

System.out.println("保存用户...");

}

}

//切面类

class TransactionAop {

public void beginTransaction() {

Sys李苦禅拿手画什么tem.out.println("[前置通驴交知] 敞开业务..");

}

public void commit() {

System.out.println("[后置告诉] 提交业务..");

}

public void afterReturing() {

System.out.println("[回来后告诉]");

}

public void afterThrowing() {

System.out.println("[反常告诉]");

}

public void a煎饼侠,张铎,拉丁舞-一点咨询,特别的新闻视角,特别的标题rroud(ProceedingJoinPoint pjp) throws Throwable {

System.out白善华.println("[盘绕前:]");

pjp.proceed(); // 履行方针办法

System.out.println("[盘绕后:]");

}

}

Spring 的 XML 配置文件:



代码的测验成果如下:


写在最终:小编为我们预备了一些适合于1-5年以上开发经历的java程序员面试涉及到的绝大部分面试题及答案做成了文档妖少you1和学习笔记文件以及架构视特茨翁频材料免费共享给我们(包含Dubbo、Redis、Netty、zooke煎饼侠,张铎,拉丁舞-一点咨询,特别的新闻视角,特别的标题eper、Spring cloud、分布式、高并发等架构技术材料),期望能够协助到我们。

获取办法:请我们转发本文,重视并私信小编(学习)

即可获取你需求的各类材料。