【Spring】Aop在项目中的配置使用详解

文章目录

      • 1 Aop 简介
      • 2 AOP实现
        • 基于xml实现AOP的方式
        • 基于注解的AOP实现

1 Aop 简介

面向切面编程,是面向对象编程的补充,在程序运行时,动态地将代码切入到类的指定方法,指定位置上的编程思想。例如转账功能,在转账代码前后需要一些非业务方面的处理,权限控制,记录日志等,这些代码就可以使用AOP将其切入到转账业务逻辑代码的前后,很好地分离业务代码和非业务代码。Aop 的有点就是降低代码耦合,提高代码的复用性。

2 AOP实现

基于xml实现AOP的方式

添加依赖

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.13</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.0.4.RELEASE</version>
    </dependency>

业务逻辑代码

public class UserServiceImpl implements UserService {


    @Override
    public void addUser() {
        System.out.println("执行service中的addUser方法");
    }

    @Override
    public void selectUser() {
        System.out.println("执行service中的selectUser方法");
    }

    @Override
    public void selectUserById(int id) throws Exception{
        System.out.println("执行service中的selectUserById方法");
        if (id == 0){
            throw new Exception();

        }
    }

    @Override
    public int updateUser() {
        System.out.println("执行service中的updateUser方法");

        return 1024;
    }

    @Override
    public void deleteUser() {
        System.out.println("执行service中的deleteUser方法");
    }
}

创建切面类MyAspect

public class MyAspect {

    public void before() {
        System.out.println("========前置通知========");
    }

    public void after() {
        System.out.println("========最终通知========:");
    }

    public void afterThrowing(Exception e) {
        System.out.println("========异常通知========:" + e);
    }

    public void afterReturning(int result) {
        System.out.println("========后置通知========:" + result);
    }

    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("========环绕通知:前========:");
        Object proceed = pjp.proceed();
        System.out.println("========环绕通知:后========:");

        return proceed;
    }
}

配置文件
定义切入点,定义切面

    <bean id="userService" class="com.monkey1024.service.UserServiceImpl"/>
    <bean id="myAspect" class="com.monkey1024.aspect.MyAspect"/>
    
<!--配置AOP-->
 <aop:config>
        <!--定义切入点-->
        <aop:pointcut id="addUserPointcut" expression="execution(* com.monkey1024.service.UserServiceImpl.addUser())"/>
        <aop:pointcut id="selectUserPointcut" expression="execution(* com.monkey1024.service.UserServiceImpl.selectUser())"/>
        <aop:pointcut id="selectUserByIdPointcut" expression="execution(* com.monkey1024.service.UserServiceImpl.selectUserById(..))"/>
        <aop:pointcut id="updateUserPointcut" expression="execution(* com.monkey1024.service.UserServiceImpl.updateUser())"/>
        <aop:pointcut id="deleteUserPointcut" expression="execution(* com.monkey1024.service.UserServiceImpl.deleteUser())"/>

        <!--定义切面 myAspect是说明哪个类是切面-->
        <aop:aspect ref="myAspect">
            <!--前置通知-->
            <aop:before  method="before" pointcut-ref="addUserPointcut"/>
            <!--后置通知-->
            <aop:after-returning method="afterReturning" pointcut-ref="updateUserPointcut" returning="result"/>
            <!--异常通知-->
            <aop:after-throwing method="afterThrowing" pointcut-ref="selectUserByIdPointcut" throwing="e"/>
            <!--最终通知-->
            <aop:after method="after" pointcut-ref="selectUserPointcut"/>
            <!--环绕通知-->
            <aop:around method="around" pointcut-ref="deleteUserPointcut"/>
        </aop:aspect>
    </aop:config>

基于注解的AOP实现

切面

@Aspect //切面
@Component
public class MyAspect {

   // 前置通知,在方法执行前切入before方面
    @Before("execution(* *..UserServiceImpl.addUser())")
    public void before() {
        System.out.println("========前置通知========");
    }

   // 后置通知
    @After("execution(* *..UserServiceImpl.selectUser())")
    public void after() {
        System.out.println("========最终通知========:");
    }
    
   // 异常通知
    @AfterThrowing(value="execution(* *..UserServiceImpl.selectUserById(..))",throwing = "e")
    public void afterThrowing(Exception e) {
        System.out.println("========异常通知========:" + e);
    }
   
   //  后置通知
    @AfterReturning(value="execution(* *..UserServiceImpl.selectUser())",returning="result")
    public void afterReturning(int result) {
        System.out.println("========后置通知========:" + result);
    }

    //  环绕通知
    @Around("execution(* *..UserServiceImpl.deleteUser())")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("========环绕通知:前========:");
        Object proceed = pjp.proceed();
        System.out.println("========环绕通知:后========:");
        return proceed;
    }
}

配置文件

  <context:component-scan base-package="com.monkey1024"/>
   <!--配置aspect自动代理-->
    <aop:aspectj-autoproxy/>

感谢您的阅读~~

你可能感兴趣的:(SSM)