AOP面向切面编程

    技术2024-06-18  79

    什么是AOP编程?

    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:

    在项目中AOP通常的作用:

    AOP编程怎么用?

    在.xml文件中引入依赖 <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> 定义一个切面逻辑类—Aspject 用 @ Aspect 注解去声明这个类是一个切面逻辑类 用 @Pointcut 注解去声明一个切入点(进行切面的时候切入点一般都是一个一个的方法,切入点的方法一定是方法的全路径) 即: @Pointcut(”execution(public void com.Student.zhuche())”) public void pointcut(){} 前置通知(前置增强) @Before(“pointcut()) Public void cunqian(){System.out.println(“存钱”);} 后置通知(后置增强) @After(“pointcut()) Public void quqian(){System.out.println(“取钱”);} 配置SpringConfig读取注解 @Configuration @EnableAspectJAutoProxy//自动执行切面逻辑 Public void SpringConfig { @Bean Public Student getStudent() { Return new Student(); } @Bean Public Aspect get Aspect () { Return new Aspect (); } } 运行方法

    其他增强类型:

    (异常切入和环绕切入不能同时存在)

    @Around(): 环绕通知,在调用前后都进行织入。(需要加入内部的一个连接点,调用过程需要显示调用)一个方法执行有两种情况: (1)正常执行,有返回值或者没有返回值 (2)异常执行 @AfterReturning(): 正常执行,有返回值或者没有返回值 @AfterThrowing(): 异常执行

    对Student类中得到所有的方法进行切入:

    public void com.Student.*()

    对带有参数的声明方法:

    public void com.Student.*(..)

    注意: 如果方法发生嵌套调用,嵌套内的方法不会被执行切入 必须显示调用方法,即通过一个AopContext的上下文会得到被代理对象的实体对象,再去调用方法,就可以得到结果。但是需要修改原逻辑代码。 即:

    ((Student)AopContext.currentProxy()).zuoche();

    把被切入的方法放到另一个类里面去实现,只要不在同一个类中就能执行切入逻辑。

    Processed: 0.015, SQL: 9