AOP叫做面向切面编程,是一种编程思想。
传统的OOP编程大多都是纵向编程,如果我们需要修改原有业务逻辑就只能去修改源代码,但是AOP编程可以在纵向编程的基础上,即原来业务逻辑的基础上,织入新的逻辑而不影响原来的代码。
比如从录取到入学需要经过买票、坐车和报道三个步骤,但是因为携带大量学费坐车不安全需要在坐车前后去银行存钱和取钱,则OOP和AOP的方法分别如下: OOP: 未进行存钱和取钱时的业务逻辑:
public class Student { public void ruxue() { maipiao(); zuoche(); baodao(); } public void maipiao() { System.out.println("买去学校的票。。。"); } public void zuoche() { System.out.println("坐车去学校。。。"); } public void baodao() { System.out.println("到学校报道。。。"); } }进行存钱和取钱时的业务逻辑:
public class Student { public void ruxue() { maipiao(); //---------存钱 cunqian(); zuoche(); //---------取钱 quqian(); baodao(); } public void cunqian() { System.out.println("------存钱-----"); } public void quqian() { System.out.println("------取钱------"); } public void maipiao() { System.out.println("买去学校的票。。。"); } public void zuoche() { System.out.println("坐车去学校。。。"); } public void baodao() { System.out.println("到学校报道。。。"); } }AOP:
(异常切入和环绕切入不能同时存在)
@Around(): 环绕通知,在调用前后都进行织入。(需要加入内部的一个连接点,调用过程需要显示调用)一个方法执行有两种情况: (1)正常执行,有返回值或者没有返回值 (2)异常执行 @AfterReturning(): 正常执行,有返回值或者没有返回值 @AfterThrowing(): 异常执行对Student类中得到所有的方法进行切入:
public void com.Student.*()对带有参数的声明方法:
public void com.Student.*(..)注意: 如果方法发生嵌套调用,嵌套内的方法不会被执行切入 必须显示调用方法,即通过一个AopContext的上下文会得到被代理对象的实体对象,再去调用方法,就可以得到结果。但是需要修改原逻辑代码。 即:
((Student)AopContext.currentProxy()).zuoche();把被切入的方法放到另一个类里面去实现,只要不在同一个类中就能执行切入逻辑。