Spring框架中AOP(面向切面编程)简单实例应用

with 0 comment

Spring框架中的AOP(面向切面编程)并不困难,米虫通过一个简单实例,分别应用到AOP各项核心概念,可以更加容易的理解AOP

SpringAopEasySl.jpg

关于AOP

米虫在《理解Spring框架中IOC和AOP概念(白话案例)》一文中,通过白话的实例解释AOP存在的意义和作用
米虫在《Spring框架中AOP(面向切面编程)的核心知识点》一文中,详细列举了AOP各项关键知识点
本文将应用这些知识点,便于更加清晰的理解和使用AOP

AOP配置信息

在Spring的XML配置文件中我们可以配置一个切面,将设计各项关键参数的配置如下:

<!-- 常规Service -->
<!-- 该项非AOP配置 -->
<bean id="userService" class="com.mebugs.service.impl.UserServiceImpl"/>

<!-- 建立一个切面Bean -->
<bean id="transactionTest" class="com.mebugs.test.tool.TransactionTest"/>

<!-- AOP切换配置 -->
<aop:config>
    <!-- 为指定的Bean进行AOP配置关联 -->
    <aop:aspect ref="transactionTest">
        <!-- **切入点**可以同时切入多个类 -->
        <!-- 可以具体切入到方法或切入所有方法,具体方法名在(..)前指定即可 -->
        <!-- 此处表示切入com.mebugs.service.impl包下所有类 -->
        <aop:pointcut expression="execution(* com.mebugs.service.impl.*.*(..))" id="pointcut"/>
        
        <!-- 前置通知 指定方法名method,通知类型可以选用 -->
        <aop:before method="before" pointcut-ref="pointcut"/>
        
        <!-- 返回通知 -->
        <aop:after method="after" pointcut-ref="pointcut"/>
        
        <!-- 正常返回通知 -->
        <aop:after-returning method="afterReturn" pointcut-ref="pointcut"/>
        
        <!-- 异常返回通知 -->
        <aop:after-throwing method="afterThrow" pointcut-ref="pointcut"/>
        
        <!-- 环绕通知 -->
        <aop:around method="around" pointcut-ref="pointcut"/>
    </aop:aspect>
</aop:config>

目标Service类

目标指的是被切入的类
可以是Strust的Action层,可以是实体bean
只要配置在Spring中的bean都可以作为目标类
这里为了使实例更易于理解,米虫使用Service类
当然目标需要在上文配置的切入点范围内

/**
 * 非常简单的用户服务类
 */
@Service
public class UserServiceImpl implements UserService {
    //自动装配
    @Autowired
    private UserDao userDao;
    //插入用户
    @Override
    public void addUser(User user) {
        userDao.insertUser(user);
        System.out.println("添加成功");
    }
    //删除用户
    @Override
    public void deleteUser(String name) {
        userDao.deteleUser(name);
        System.out.println("删除成功");
    }
}

切面类实例

该类中的相应通知方法均在XML中的AOP配置一一对应

public class TransactionTest{
    //这些通知的方法名没有限制
    //前置
    public void before()
    {
       System.out.println("请注意,有数据要来了");
    }
    //返回
    public void after()
    {
       System.out.println("请注意,完成返回");
    }
    //环绕
    public void around(ProceedingJoinPoint joinPoint) throws Throwable
    {
        System.out.println("&环绕&请注意,有数据要来了");
        //切入点方法执行,环绕通知是可以中断执行的
        //因此环绕通知在实际应用中更为广泛
        joinPoint.proceed();
        System.out.println("&环绕&请注意,完成返回");
    }
    //正常返回
    public void afterReturn()
    {
       System.out.println("请注意,正常完成返回");
    }
    //异常返回
    public void afterThrow()
    {
       System.out.println("请注意,异常返回");
    }
}
Responses