java - spring - AOP

Posted 不咬人的兔子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java - spring - AOP相关的知识,希望对你有一定的参考价值。

AOP: 面向切面编程(Aspect oriented Programming)

说白了就是把常用业务方法打包,在放在需要的位置。这个和OOP(面向对象)是不冲突的,只是为了完善面向对象编程中的一些业务逻辑问题。

比如:

A在运行的时候,打印日志。

B在运行的时候,打印日志。

传统方法:

A运行结束位置写一个log方法。

B运行结束位置写一个log方法。

这样万一是个大项目,有100方法都需要打印日志。万一有改动(比如客户要求改打印格式),全部修改一遍工作量很大。

所以为了解决这个问题,有了AOP编程思想。

 

因为打印log的方法是基本通用的,所以可以专门写一个方法集中管理。然后所有目标的方法执行的时候统一调用这里的方法。把方法分配到需要的位置。

Spring的AOP主要就是干这个的。

 

步骤:

1.  添加一个用类,集合了需要的方法

2. 添加spring的注解(我这里是@Component),交给spring组建管理

3. 添加aspect注解,表示这个是用来aop的类

4. 添加对应注解和表达式用来告诉spring这些方法是在哪些类的什么时候使用

5. 添加配置文件,开启AOP模式

 

java:

package com.itheima.service;



import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import com.itheima.domain.Account;
import sun.misc.Signal;

@Component
@Aspect
public class AopTest {


    //* * com.itheima.service.AccountService.*(..)  返回任意权限,任意返回类型,的这个类中的任意方法,参数可以是任意。根据具体需求修改

    //@Before("execution(public void com.itheima.service.AccountService.aopTest())")   //在AccountService类的aopTest运行前,运行该方法
    @Before("execution(public * com.itheima.service.serviceImpl.AccountServiceImpl.*(..))")//在AccountServiceImpl类的findAll运行前,运行该方法
    public void beforeShowData(){
        System.out.println("目标方法准备运行");
    }

    @After("execution(public * com.itheima.service.AccountService.*(..))")   //在AccountService类的aopTest运行后,都运行该方法
    public void afterShowData(JoinPoint joinPoint){  //使用 JoinPoint作为参数可以获得方法的详细信息
        Signature s = joinPoint.getSignature(); //获取方法签名
        System.out.println(s.getName() + "方法运行了");
    }

    @AfterReturning("execution(public void com.itheima.service.AccountService.aopTest())")   //在AccountService类的aopTest正常结束后,运行该方法
    public void afterReturnShowData(){
        System.out.println("目标方法返回了");
    }

    @AfterThrowing("execution(public void com.itheima.service.AccountService.aopTest())")   //在AccountService类的aopTest抛出异常时,运行该方法
    public void afterThrowData(){
        System.out.println("目标方法抛出异常");
    }
}
package com.itheima.test;

import com.itheima.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

    @Test
    public void test1() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("springConfig.xml");//手动加载配置文件
        AccountService as = (AccountService)ac.getBean("accountService");
        //as.findAll(); //测试spring能否运行


        as.aopTest();
    }
}

 

 

配置文件中添加:

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

 

 

结果:

目标方法准备运行
aop测试。
aopTest方法运行了
目标方法返回了

 

 

 

 

 

以上是关于java - spring - AOP的主要内容,如果未能解决你的问题,请参考以下文章

spring aop中this和target区别

Java spring -- AOP

推荐学java——Spring之AOP

Spring AOP学习

Java——面向切面编程,Spring中的AOP编程

Java--Spring之AOP面向切面编程